如何在R函数体中用它们的值替换符号

时间:2016-10-19 20:09:18

标签: r function

此代码显示f在调用之前尚未查找q

q <- 2
f <- function(x) q + x
f

我想告诉R身体中哪些符号立即查找(在本例中为list("q"))并相应地修改f。怎么办呢?

3 个答案:

答案 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函数将值隐藏在返回对象的环境中。我想到的两个是ecdfsplinefun

答案 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