我试图了解 R 的local
功能是如何工作的。有了它,你可以打开一个临时的局部作用域,这意味着发生在local
(最值得注意的是变量定义)中的东西,保留在local
. 只有块的最后一个值被返回给外界。所以:
x <- local({
a <- 2
a * 2
})
x
## [1] 4
a
## Error: object 'a' not found
local
定义如下:
local <- function(expr, envir = new.env()){
eval.parent(substitute(eval(quote(expr), envir)))
}
据我了解,会发生两轮表达式引用和后续评估:
eval(quote([whatever expr input]), [whatever envir input])
由 生成为未评估的调用substitute
。- 调用在
local
的调用者框架(在我们的例子中是全局环境)[whatever expr input]
中进行评估,因此在[whatever envir input]
但是,我不明白为什么第 2 步是必要的。为什么我不能local
像这样简单地定义:
local2 <- function(expr, envir = new.env()){
eval(quote(expr), envir)
}
我认为它会expr
在空环境中评估表达式?所以定义的任何变量都expr
应该存在envir
并因此在结束后消失local2
?
但是,如果我尝试这个,我会得到:
x <- local2({
a <- 2
a * 2
})
x
## [1] 4
a
## [1] 2
因此a
泄漏到全球环境。为什么是这样?
编辑:更神秘:为什么它不会发生:
eval(quote({a <- 2; a*2}), new.env())
## [1] 4
a
## Error: object 'a' not found