R:使用eval和函数进行动态范围设定

时间:2014-07-24 06:46:15

标签: r eval scoping

我对使用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不同。

如果你能指出我错过的东西会很棒。

非常感谢!

1 个答案:

答案 0 :(得分:0)

我真的不明白这个问题。在g() - 函数内部,您询问了本地环境中的项目并得到了&#34; b&#34;输出到控制台作为print(的副作用。它并不需要查看e1&#39; e1&#39;因为它的当地环境甚至更接近&#34;然后你得到了&#34; b&#34;作为从print返回的值,它作为隐式REPL的一部分打印出来。再次评估h()时,它会报告函数定义时的环境。那个词汇范围。