2017-09-25 28 views
2

让我们的环境评估的表达式:在执行`eval`时,R在哪里查找对象?

> myenv <- new.env() 
> assign("x", 2, myenv) 
> f <- function(x) x+1 
> eval(expression(f(x)), myenv) 
[1] 3 

我不明白为什么它的工作原理,因为fmyenv。 R如何找​​到f

让我们看看帮助:

Usage 

eval(expr, envir = parent.frame(), 
      enclos = if(is.list(envir) || is.pairlist(envir)) 
         parent.frame() else baseenv()) 

Arguments 

envir 
the environment in which expr is to be evaluated. May also be NULL, a list, a data frame, a pairlist or an integer as specified to sys.call. 
enclos 
Relevant when envir is a (pair)list or a data frame. Specifies the enclosure, i.e., where R looks for objects not found in envir. This can be NULL (interpreted as the base package environment, baseenv()) or an environment. 

所以说,R还看起来enclos,这是baseenv()这里。但f不在baseenv()

回答

2

当您执行myenv <- new.env()时,默认情况下它会将新环境的父环境设置为当前环境。签名是

new.env(hash = TRUE, parent = parent.frame(), size = 29L) 

因此,如果一个符号名未在环境中解决,您在执行,R表达将检查父环境的链条。您可以通过将空白环境指定为父环境来禁用该行为。

myenv <- new.env(parent=emptyenv()) 
assign("x", 2, myenv) 
f <- function(x) x+1 
eval(expression(f(x)), myenv) 
# Error in f(x) : could not find function "f" 
+0

好的,谢谢。我发现文档不清楚。但是,也许我是那个误解的人...... –

+0

当你的'envir ='参数不是一个可以有父环境的环境时 - 例如当'envir ='是一个列表时,使用'enclos'会更有意义或一个data.frame。 – MrFlick