在R中,我注意到eval.parent
和评估变量名时搜索的环境有一些奇怪的行为。以下是一个例子:
> f = function() {i = 1; g()}
> g = function() {eval.parent(substitute(i))}
> f()
[1] 1
这可以按预期工作。表达式i
在名为g
的环境中进行评估,f
的正文为1
,结果为i
。
但是,如果我在g
的正文中定义> g = function() {i = 2; eval.parent(substitute(i))}
> f()
[1] 2
,那么尽管在父框架中计算了表达式,但仍会使用该值。
2
为什么结果i = 2
在这种情况下? eval.parent
的定义应该被eval
完全忽略,因为表达式是在父框架中计算的。在更仔细地检查环境后,eval.parent
对f
的调用也会传递到与sys.frames
检查的{{1}}框架相对应的环境。