此代码显示f
在调用之前尚未查找q
。
q <- 2
f <- function(x) q + x
f
我想告诉R身体中哪些符号立即查找(在本例中为list("q")
)并相应地修改f
。怎么办呢?
答案 0 :(得分:5)
在Common Lisp中,这看起来像:
CL-USER> (defparameter q 4)
Q
CL-USER> (let ((bar q))
(defmacro f (x)
`(+ ,bar ,x)))
F
CL-USER> (macroexpand-1 `(f 4))
(+ 4 4)
T
在R中,这可能看起来像:
> q = 2
> f = eval(bquote(function(x) .(q) + x))
> f
function (x)
2 + x
>
由于R被解释,eval与那里的球场相同。使用Common Lisp,如果你不想使用eval,你可以使用编译时宏来携带一个硬编码的值,以便每次在代码中使用它时它上面指的是宏在创建时的值。
答案 1 :(得分:2)
实际上,当您为function
的值进行分配时会发生什么事情,这是错误的。看看这个:
> environment(f)$q
[1] 2
一些基本R函数将值隐藏在返回对象的环境中。我想到的两个是ecdf
和splinefun
。
答案 2 :(得分:2)
您可以使用以下内容:
f_generator = function(q){
q
function(x){
q + x
}
}
f2 = f_generator(2)
f3 = f_generator(3)
f2(1)
# 3
f3(1)
# 4