我试图了解 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