首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >parent.env( X)混淆

parent.env( X)混淆
EN

Stack Overflow用户
提问于 2011-12-26 15:40:27
回答 3查看 441关注 0票数 10

我已经阅读了parent.env()的文档,它看起来相当简单--它返回了封闭的环境。但是,如果我使用parent.env()来遍历封闭环境的链,我会看到一些我无法解释的东西。首先,代码(摘自"R中的一个简单的“)

代码语言:javascript
复制
library( PerformanceAnalytics )
x = environment(chart.RelativePerformance)
while (environmentName(x) != environmentName(emptyenv())) 
{ 
    print(environmentName(parent.env(x)))
    x <- parent.env(x)
}

其结果是:

代码语言:javascript
复制
[1] "imports:PerformanceAnalytics"
[1] "base"
[1] "R_GlobalEnv"
[1] "package:PerformanceAnalytics"
[1] "package:xts"
[1] "package:zoo"
[1] "tools:rstudio"
[1] "package:stats"
[1] "package:graphics"
[1] "package:utils"
[1] "package:datasets"
[1] "package:grDevices"
[1] "package:roxygen2"
[1] "package:digest"
[1] "package:methods"
[1] "Autoloads"
[1] "base"
[1] "R_EmptyEnv"

我们如何解释顶部的“基础”和底部的“基础”呢?另外,我们如何解释"package:PerformanceAnalytics“和"imports:PerformanceAnalytics"?没有前两行,一切似乎都是一致的。也就是说,函数chart.RelativePerformance在包中:PerformanceAnalytics环境,由xts创建,由动物园创建,一路向上(或向下)到基地和空环境。

而且,文档对此并不十分清楚--“封闭环境”是否是创建另一个环境的环境,从而遍历parent.env()是否显示了一个“创建”链?

编辑

无耻的插件:我编写了一个博客帖子,它用直观的图表解释环境、parent.env()、附件、命名空间/包等等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-26 16:22:44

结果中的前几项提供了R用于搜索在带有名称空间的包中的函数中使用的变量的规则。来自文本手册

命名空间控制包中函数使用的变量的搜索策略。如果没有在本地找到,R首先搜索包命名空间,然后搜索导入,然后搜索基本名称空间,然后搜索普通搜索路径。

详细说明一下,看看chart.RelativePerformance的前几行

代码语言:javascript
复制
head(body(chart.RelativePerformance), 5)
# {
#     Ra = checkData(Ra)
#     Rb = checkData(Rb)
#     columns.a = ncol(Ra)
#     columns.b = ncol(Rb)
# }

当计算对chart.RelativePerformance的调用时,每个符号--无论是第1行的checkData还是第3行的ncol --都需要在搜索路径的某个位置找到。下面是检查的最初几个封闭环境:

  • 首先是namespace:PerformanceAnalytics。在那里发现了checkData,但ncol却没有。
  • 下一站(结果中列出的第一个位置)是imports:PerformanceAnalytics。这是包的NAMESPACE文件中指定为imports的函数列表。这里也没有找到ncol
  • base环境命名空间(将在其中找到ncol )是进入正常搜索路径之前的最后一站。几乎任何R函数都会使用一些base函数,因此这个停止确保所有这些功能都不会被全局环境或其他包中的对象破坏。(r的设计人员本来可以让包作者在他们的base文件中显式导入NAMESPACE环境,但是添加这个通过base的默认传递似乎是更好的设计决策。)
票数 3
EN

Stack Overflow用户

发布于 2011-12-26 16:56:22

1)关于base如何两次存在(假设环境形成一棵树),这是environmentName函数的错误。实际上,第一个事件是.BaseNamespaceEnv,后一个事件是baseenv()

代码语言:javascript
复制
> identical(baseenv(), .BaseNamespaceEnv)
[1] FALSE

2)关于imports:PerformanceAnalytics,这是R设置的一个特殊环境,用于保存包的命名空间或描述文件中提到的导入,以便在其他任何情况下都会遇到其中的对象。

为了清楚起见,试着运行这个程序。str(p)和下面的if语句将更好地了解p是什么:

代码语言:javascript
复制
library( PerformanceAnalytics )
x <- environment(chart.RelativePerformance)
str(x)
while (environmentName(x) != environmentName(emptyenv())) { 
    p <- parent.env(x)
    cat("------------------------------\n")
    str(p)
    if (identical(p, .BaseNamespaceEnv)) cat("Same as .BaseNamespaceEnv\n")
    if (identical(p, baseenv())) cat("Same as baseenv()\n")
    x <- p
}
票数 5
EN

Stack Overflow用户

发布于 2011-12-26 16:47:26

第二个base.BaseNamespaceEnv,而最后一个basebaseenv()。它们没有什么不同(可能是w.r.t。它的父母)。.BaseNamespaceEnv的父级是.GlobalEnvbaseenv()的父级是emptyenv()

在包中,正如@Josh所说,R搜索包的名称空间,然后搜索导入,然后搜索基(即BaseNamespaceEnv)。

你可以通过以下方式找到这一点:

代码语言:javascript
复制
> library(zoo)

> packageDescription("zoo")
Package: zoo

# ... snip ...

Imports: stats, utils, graphics, grDevices, lattice (>= 0.18-1)

# ... snip ...

> x <- environment(zoo)

> x
<environment: namespace:zoo>

> ls(x) # objects in zoo
  [1] "-.yearmon"                "-.yearqtr"                "[.yearmon"               
  [4] "[.yearqtr"                "[.zoo"                    "[<-.zoo"                 
# ... snip ...

> y <- parent.env(x)
> y # namespace of imported packages
<environment: 0x116e37468>
attr(,"name")
[1] "imports:zoo"

> ls(y) # objects in the imported packages

   [1] "?"                                     "abline"                               
   [3] "acf"                                   "acf2AR"                               
# ... snip ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8637107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档