【问题标题】:Does an environment NOT on the search path have a parent?不在搜索路径上的环境是否有父环境?
【发布时间】:2015-01-01 07:32:11
【问题描述】:

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

它说除了 emptyenv 之外的每个环境都有一个父环境。我需要帮助来理解一些可以让我明白这一点的东西——也许我只是把它复杂化了或者误解了变量在 R 中是如何工作的。

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

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

那么哪个是正确的? myenv 的父环境是什么?
我知道我可以使用parent.env<- 更改环境的父级,但是如果我像上面的示例一样附加它,我不明白什么才是真正的父级

【问题讨论】:

    标签: r


    【解决方案1】:

    问题是附加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 了解更多信息。

    【讨论】:

    • 感谢您澄清这一点,这是您链接的一篇很棒的博文
    【解决方案2】:

    父环境是您从中定义新环境的机箱。但是,对于函数来说并非如此。如果您要定义一个函数,则父框架将是调用它的环境,而不是定义(请参阅help(sys.parent))。

    Environment 文档内容丰富。

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

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

    因此,父环境是全局环境也就不足为奇了。如果您将 myenv 分配在不同的外壳中,那将是它的父级。

    空的环境是行尾

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多