我正在玩R并发现与全球环境有些不一致的函数调用与实际的全球环境不同。
请考虑以下事项:
> test = function ()
+ {
+ print(environmentName(as.environment(-1)))
+ print(ls(as.environment(-1)))
+ print(environmentName(.GlobalEnv))
+ print(ls(.GlobalEnv))
+ as.environment(-1)
+ }
> foo = 1
> ls()
[1] "foo" "test"
> test()
[1] ""
[1] "doTryCatch" "expr" "handler" "name" "parentenv"
[1] "R_GlobalEnv"
[1] "foo" "test"
<environment: R_GlobalEnv>
在函数调用中,as.environment(-1)
返回声称它为<environment: R_GlobalEnv>
的环境,但在所述环境中调用environmentName
时,其名称为空字符。此外,它的内容不同于真实的全球环境。到底发生了什么?
我首先在调用中注意到使用mget
的错误,因为无法找到全局定义的变量。这似乎是违反直觉的,因为通常在引用函数中的变量时,R将在封闭环境中向上搜索,直到找到变量的定义,包括全局环境。
答案 0 :(得分:4)
这是懒惰评估的结果:
test <- function () {
e <- as.environment(-1)
list(
lazy = ls(as.environment(-1)),
eager = ls(envir = e)
)
}
foo <- 1
test()
#> $lazy
#> [1] "doTryCatch" "expr" "handler" "name" "parentenv"
#>
#> $eager
#> [1] "foo" "test"