不在搜索路径上的环境是否有父级?

时间:2015-01-01 07:32:12

标签: r

我正在阅读Hadley Wickham's Advanced R book,目前正在阅读"环境"章

它说除了emptyenv之外的每个环境都有一个父级。我需要帮助理解能够清除这一点的东西 - 也许我只是过于复杂或者误解了R中变量的工作原理。

我们说我定义了自己的环境:
myenv <- new.env()
现在,如果我做一个简单的parent.env(myenv),我确实得到了预期的全局环境。

但是现在当我附加这个环境时会发生什么,导致它进入全局环境上方的搜索路径? attach(myenv)
现在,如果我使用search()查看搜索路径,我可以看到myenv.GlobalEnv的父级。我还可以使用返回parent.env(globalenv())的{​​{1}}来验证这一点。如果我运行myenv,那么我得到parent.env(parent.env(globalenv()))这是有道理的 但是如果我尝试直接使用tools:rstudio查看myenv的父级,我会获得全局环境。为了得到我期望的结果(parent.env(myenv)),我需要手动将环境投射到环境中:tools:rstudio返回parent.env(as.environment("myenv"))

哪个是正确的? myenv的父母环境是什么? 我知道我可以使用tools:rstudio更改环境的父级,但如果我只是像上面的示例中那样附加它,我就不会理解被认为是真正的父级

2 个答案:

答案 0 :(得分:7)

问题是,附加myenv会创建myenv副本(并且还会修改其父级),因此我们现在有两个myenv个环境,他们可以是和不同的。你已经在问题中表明他们有不同的父母。在新的会话中尝试这一点,以进一步表明它们是截然不同的:

myenv <- new.env()
myenv$x <- 1

# with the attach below we now have 2 myenv environments - 
#   the one above and the new one created in the attach below on the search path.
attach(myenv)

# this changes x in the original myenv but not the x in the copy on the search path
myenv$x <- 2  
myenv$x
## 2

# the copy of myenv on the search path still has the original value of x
as.environment("myenv")$x
## 1

查看此blog post了解更多信息。

答案 1 :(得分:6)

父环境是您定义新环境的机箱。但是,功能并非如此。如果您正在定义一个函数,那么父框架将是调用它的环境,未定义(参见help(sys.parent))。

Environment 文档非常有用。

  

new.env返回一个新的(空)环境,其中(默认情况下)封装父框架。

     

parent.env返回其参数的封闭环境。

因此,父环境是全球环境也就不足为奇了。如果您在另一个机箱中分配了myenv,那么它将是其父机构。

空的env是行的结尾

parent.env(baseenv())
# <environment: R_EmptyEnv>

parent.env(parent.env(baseenv()))
# Error in parent.env(parent.env(baseenv())) : 
#  the empty environment has no parent

这里还有其他有用的东西......

  

如果通过从任何环境重复调用parent.env找到一个附件链,那么最终会到达空的环境emptyenv(),其中没有任何内容可以分配。

我想这也取决于搜索路径上的内容以及您是否将其附加到搜索路径。

myenv <- new.env()
attach(myenv)
sapply(search(), function(x) {
    attr(parent.env(as.environment(x)), "name")
})

在搜索路径中列出了环境及其父母的列表。

$.GlobalEnv
[1] "myenv"

$myenv
[1] "package:stringi"

...
...

$`package:base`
NULL

[[12]]
<environment: R_EmptyEnv>