我对使用R进行动态范围设计相对较新,并且在使用eval更改我自己定义的函数执行的范围/环境时遇到了一些问题。
首先,我创建一个简单的环境:
> e1 <- new.env(environment())
> e1$a <- 10;
> e1
<environment: 0x5a187a8>
然后,我用ls()测试了eval:
> evalq (ls(), e1)
[1] "a"
> evalq (print(a), e1)
[1] 10
到目前为止一切顺利。
然后,我定义了2个样本函数:
g <- function () {
b <- 20;
print (ls());
}
h <- function() {
print (environment());
print (parent.env(environment()));
NULL;
}
我尝试在e1
的上下文中评估它们> eval (g(), e1)
[1] "b"
> eval (h(), e1)
<environment: 0x53a1a68>
<environment: R_GlobalEnv>
似乎g和h都没有在e1中评估 - 因为h中打印的环境与e1不同。
如果你能指出我错过的东西会很棒。
非常感谢!
答案 0 :(得分:0)
我真的不明白这个问题。在g() - 函数内部,您询问了本地环境中的项目并得到了&#34; b&#34;输出到控制台作为print(
的副作用。它并不需要查看e1&#39; e1&#39;因为它的当地环境甚至更接近&#34;然后你得到了&#34; b&#34;作为从print
返回的值,它作为隐式REPL的一部分打印出来。再次评估h()时,它会报告函数定义时的环境。那个词汇范围。