[英]Inconsistency with R's Global Environment in a function call
我正在玩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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.