R 宏:如何 f(x) --> g("x")
R macro: how to f(x) --> g("x")
我如何使用 defmacro(来自 gtools)来安排它,以便当我键入 f(x)
时,结果是 g("x")
的 return 值?
我想(因为我是一名 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")
的 return 值 任意 用户定义的g
(但我希望得到一个对g
有轻微限制的答案)。
when I type f(x)
the result is the return value of g("x")
for
arbitrary user-defined 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
.
我如何使用 defmacro(来自 gtools)来安排它,以便当我键入 f(x)
时,结果是 g("x")
的 return 值?
我想(因为我是一名 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")
的 return 值 任意 用户定义的g
(但我希望得到一个对g
有轻微限制的答案)。
when I type
f(x)
the result is the return value ofg("x")
for arbitrary user-definedg
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
.