我当时正在玩弄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将在封闭环境中向上搜索,直到找到包括全局环境的变量的定义。
看来,'不需要environmentName'显示这种差异。这两个打印语句给出了不同的结果: 'test < - function(){e < - as.environment(-1);印刷(E); print(as.environment(-1))}; test()' –
同样比较:'print(as.environment(-1)); I(as.environment(-1)); C(as.environment(-1))'。他们都给出了不同的结果,可能与他们如何以及在哪里评估他们提供的论点有关,尽管我不清楚发生了什么事情。相关的C级源代码是[here](https://github.com/wch/r-source/blob/trunk/src/main/envir.c#L2833)和[here](https:// github。 COM/WCH/R-源/斑点/中继/ SRC /主/ envir.c#L2789)。 (后者提到了'as.environment(-1)'和'pos.to.env(-1)'的等价性。) –