R:功能 - 显示环境名称而不是该环境的内存地址?

时间:2012-10-02 21:34:57

标签: r

如同内置函数一样,在函数内显示环境名称的方法是什么?例如,当我输入函数:在基础包中可用时,我可以将环境视为“命名空间:基础”。

mean

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

但是,当我将函数附加到新创建的环境时,这里访问函数(f)中的自由变量(z)的值,它会自动驻留在.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软件包中提供的函数一样?环境数据结构与search()

中提供的.GlobalEnv环境之间是否存在差异

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

谢谢

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

您可以使用attr设置环境名称,如下所示:

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

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

答案 2 :(得分: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)

答案 3 :(得分:0)

您可以使用我刚开发的最新发布的软件包envnames作为此问题的解决方法。

在您的示例中,如果使用包的environment_name()函数来检索函数from PIL import Image . . . file_name = "D:/tmp.png" enc = tf.image.encode_png(img_res) file = tf.write_file(file_name, enc) print('PNG Image Saved') session.close() Image.open(file_name).save("D:/out.bmp") os.remove(file_name) 的环境,则会得到f(),而不是"e1"使用内置函数"",即:

environmentName()

,输出为:

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

在Hadley给出的示例中,许多环境都指向同一环境,您将在命名数组中获得所有这些环境名称:

[1] "e1"

其中输出包括每个环境的位置作为返回数组的名称属性:

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

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

最后,由于您提到了解环境的内存地址对我们所讨论的用户定义环境没有多大作用,因此您可以将内存地址用作R_GlobalEnv R_GlobalEnv R_GlobalEnv "e1" "e2" "e3" 函数的输入参数,以获取与内存地址关联的一个或多个环境的名称。

下面的代码和输出片段对此进行了说明(其中代码在一个环境的您的示例中运行)

environment_name()