在函数调用中与R的全局环境不一致

时间:2014-03-03 16:10:34

标签: r

我正在玩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将在封闭环境中向上搜索,直到找到变量的定义,包括全局环境。

1 个答案:

答案 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"