我正在玩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 会在封闭环境中向上搜索,直到找到变量的定义,包括全局环境。
这是惰性求值的结果:
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"