我已经阅读了parent.env()的文档,它看起来相当简单--它返回了封闭的环境。但是,如果我使用parent.env()来遍历封闭环境的链,我会看到一些我无法解释的东西。首先,代码(摘自"R中的一个简单的“)
library( PerformanceAnalytics )
x = environment(chart.RelativePerformance)
while (environmentName(x) != environmentName(emptyenv()))
{
print(environmentName(parent.env(x)))
x <- parent.env(x)
}其结果是:
[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()、附件、命名空间/包等等。
发布于 2011-12-26 16:22:44
结果中的前几项提供了R用于搜索在带有名称空间的包中的函数中使用的变量的规则。来自文本手册
命名空间控制包中函数使用的变量的搜索策略。如果没有在本地找到,R首先搜索包命名空间,然后搜索导入,然后搜索基本名称空间,然后搜索普通搜索路径。
详细说明一下,看看chart.RelativePerformance的前几行
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的默认传递似乎是更好的设计决策。)发布于 2011-12-26 16:56:22
1)关于base如何两次存在(假设环境形成一棵树),这是environmentName函数的错误。实际上,第一个事件是.BaseNamespaceEnv,后一个事件是baseenv()。
> identical(baseenv(), .BaseNamespaceEnv)
[1] FALSE2)关于imports:PerformanceAnalytics,这是R设置的一个特殊环境,用于保存包的命名空间或描述文件中提到的导入,以便在其他任何情况下都会遇到其中的对象。
为了清楚起见,试着运行这个程序。str(p)和下面的if语句将更好地了解p是什么:
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
}发布于 2011-12-26 16:47:26
第二个base是.BaseNamespaceEnv,而最后一个base是baseenv()。它们没有什么不同(可能是w.r.t。它的父母)。.BaseNamespaceEnv的父级是.GlobalEnv,baseenv()的父级是emptyenv()。
在包中,正如@Josh所说,R搜索包的名称空间,然后搜索导入,然后搜索基(即BaseNamespaceEnv)。
你可以通过以下方式找到这一点:
> 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 ...https://stackoverflow.com/questions/8637107
复制相似问题