我正在阅读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
更改环境的父级,但如果我只是像上面的示例中那样附加它,我就不会理解被认为是真正的父级
答案 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>