2012-10-02 45 views
6

与内置函数一样,在函数内部显示环境的名称的方法是什么?例如,当我键入基本包中的函数:mean时,我可以将环境看作“namespace:base”。R:函数 - 显示环境名称而不是该环境的内存地址?

mean 

    function (x, ...) 
    UseMethod("mean") 
    <bytecode: 0x0547f17c> 
    **<environment: namespace:base>** 

然而,当我附上一个功能到新创建的环境,这里访问函数内的自由变量(Z)的值(F),它会自动驻留在.GlobalEnv环境和名称该功能内部不显示环境,但可以看到(e1)环境的存储器地址“0x051abd60”。

 e1 <- new.env() 
    e1$z <- 10 
    f <- function(x) { 
      x + z 
     } 
    environment(f) = e1 
    f 

       function(x) { 
        x + z 
       } 
       **<environment: 0x051abd60>** 

为什么我会看到这种行为?为什么我不能像R的内置函数一样在函数内部获取我的环境名称,以及各种R包中提供的函数?环境数据结构和搜索环境中可提供的环境数据结构是否存在差异

任何指向此行为背后动机的指针都将受到高度赞赏。

谢谢

回答

4

如果我没有记错,用于封装环境的名称和命名空间在C级别分配。所以用户创建的环境不会显示名称。即使存在名为environmentName()的基准函数(误导性名称),也不能在R中设置环境名称。它只会返回C级分配的名称。它实际上仅用于包和命名空间,而不是其他环境。

+0

我尝试将名称添加到使用environmentName(E1)环境< - “E1”,却得到了一个错误像“找不到功能environmentName ...”。另外,每个环境都有独特的配置文件。我还没有使用过软件包,但了解R – Sathish

+0

中变量及其数据结构的命名空间行为是否值得你猜对于environmentName()函数有什么作用? – Sathish

3

大多数环境没有名称 - 环境的名称是环境的特殊属性,而不是指向该环境的对象的名称。例如。在下面的情况下,你会期望f的环境的“名称”是什么?

e1 <- new.env() 
e1$z <- 10 
e2 <- e1 
e3 <- e1 

f <- function(x) { 
    x + z 
} 
environment(f) <- e1 

identical(e1, e2) 
identical(e1, e3) 
+0

f的环境没有名称,但指向e1或e2或e3的指针已赋给它。 – Sathish

+0

我对环境的理解是,有些环境具有“名称的特殊属性”。例如:内置环境带有名称,但用户定义的环境不允许为其添加名称特殊属性。虽然,我没有看到具有这种特殊属性的用户定义环境的具体用法,因为环境以其对象名称链接到其他对象,并且在内部指定了一个指针以在环境与其分配的对象之间进行交互。 – Sathish

+0

感谢您的解释:) +1 – Sathish

0

您可以设置使用attr环境的名称,像这样:

e <- new.env() 
attr(e, "name") <- "xyzzy" 

environmentName(e) 
## [1] "xyzzy"