2016-11-30 3 views
2

Как я могу использовать defmacro (from gtools), чтобы упорядочить его так, чтобы при вводе f(x) результатом было возвращаемое значение g("x")?R macro: как f (x) -> g ("x")

Я полагаю (потому что я программист на C), в котором участвует defmacro ... но я был бы счастлив достичь цели с помощью defmacro или без него.

К сожалению f <- defmacro(x, expr={ g(quote(x)) }) поражен и пропустить ... это работает для некоторых функций, но не выполняется для других, как, например,

g <- function(v) { 
    eval(parse(text=paste0("f0 = lm(Sale_Price ~ ", v, ", data = d1)"))) 
    r0 <- data.frame(predict(f0, d1), d1$Sale_Price) 
    colnames(r0) <- c(v, "Sale_Price") 
    ggplot() + 
    labs(x= v, y= "Sale_Price") + 
    geom_point(data = r0, aes(get(v), Sale_Price), colour="black") + 
    geom_smooth(data = r0, method = "lm", aes(x = get(v), y Sale_Price), colour="blue", se = FALSE) 
} 

я могу изменить приведенное выше определение, так что f <- defmacro(x, expr={ g(quote(x)) }) получится ... но это не мой вопрос. Я хочу знать, как вообще может быть устроено так, что, когда я печатаю f(x) результат возвращаемого значение g("x") для произвольной определяемого пользователя g (но я был бы признателен за ответ, который работает с умеренными ограничениями на g) ,

ответ

4

, когда я печатаю f(x) результат возвращаемое значение g("x") для произвольно определяемых пользователем g

f <- function(x, g) { 
    g(as.character(substitute(x))) 
} 

#using paste as an example of g  
f(a, paste) 
#[1] "a" 

Не используйте eval(parse()). Забудьте, что он существует до тех пор, пока вы не будете намного более продвинуты в своем знании языка. Вы можете сделать что-то вроде этого:

form <- as.formula(sprintf("Sale_Price ~ %s", v)) 
f0 <- lm(form, data = d1) 

Кроме того, исследование help("aes_string"). Вам не нужно get.