如何从环境字符串中获取环境对象?

How to get the environment object from the environment string?

提问人:mshaffer 提问时间:9/17/2022 最后编辑:Dharmanmshaffer 更新时间:3/11/2023 访问量:162

问:

假设我创建了一个函数:

x = function() { print(environmentName(environment())); envir=environment(); print(envir); print(environmentName(envir)); print(environmentName(environment())); print(environmentName(as.environment(environment()))); print(environmentName(parent.env(environment()))); envir; }

在我的计算机上,它仅在一个实例中打印出环境的唯一哈希值。这就引出了一个基本问题,即什么是函数以及函数实际上是如何工作的。envirenvironmentName(envir)

例如

( env = x() );

输出:

> ( env = x() );
[1] ""
<environment: 0x000001fec97c3eb0>
[1] ""
[1] ""
[1] ""
[1] "R_GlobalEnv"
<environment: 0x000001fec97c3eb0>

并报告一个 “” EMPTY 环境名称:

> environmentName(env)
[1] ""

当我期待一根绳子或其他东西时。我想每次调用函数时,我都会得到一个新环境。"0x000001fec97c3eb0"x

> environmentName(x)
[1] ""
> environmentName(environment(x))
[1] "R_GlobalEnv"

新环境

也许除非它被“固定”到包或附加为环境? 从(如何在 R 中获取变量的环境)

a <- new.env(parent=emptyenv())
a$x <- 3
attach(a)
b <- new.env(parent=emptyenv())
b$x <- 4

这将产生:

environmentName(a);
environmentName(b);

都是空的 “” ???

它似乎确实适用于以下内容,从 GLOBAL 调用:

> environmentName(environment());
[1] "R_GlobalEnv"

因此,似乎存在一个基本问题:

基础问题:究竟是如何工作的?environmentName

但这不是我的主要问题。上面的示例是一个函数,它有一个作为输入并返回一个字符串。我怎样才能扭转这个过程。也就是说,如果我有一个字符串名,我如何返回 R 对象?envirR_GlobalEnvenvir

主要问题:有没有一个函数可以反转 ?environmentName

也就是说,如果我有一个 的 stringname ,我应该调用什么函数来反转它?或者可以编写什么函数来增强体验?environmentNameR

例如,

env.toName = function(envir=environment()) { environmentName(envir); }
env.fromName = function(envirstr) { XXVXX(envirstr); }
R 命名空间 作用域

评论


答:

0赞 user2554330 9/17/2022 #1

并非所有环境都有名称,这就是您有时会看到的原因。 只返回 的属性。""environmentName(env)"name"env

没有标准函数可以获取名称并返回环境:要编写一个,您必须在视图中搜索所有变量以查找环境,然后单独检查每个变量的名称。您可能会发现多个具有相同名称属性的,例如

a <- new.env()
attr(a, "name") <- "myenv"
b <- new.env()
attr(b, "name") <- "myenv"
environmentName(a)
#> [1] "myenv"
environmentName(b)
#> [1] "myenv"

创建于 2022-09-17 使用 reprex v2.0.2

环境中的名称只是作为装饰,而不是用于唯一标识。使用以下命令检查相等性:identical()

d <- a
environmentName(d)
#> [1] "myenv"
identical(a, b)
#> [1] FALSE
identical(a, d)
#> [1] TRUE

评论

0赞 mshaffer 9/21/2022
您似乎在说函数只是获取属性?如果是这样的话,我如何从环境对象中获取环境名称......如何提取为字符串?那么问题就反过来了。如果我有字符串,我可以得到函数名称吗?nameTRUE<environment: 0x000001fec97c3eb0>0x000001fec97c3eb00x000001fec97c3eb0
0赞 user2554330 9/22/2022
没有“真正的”环境名称。您看到的只是环境对象没有名称时的打印方式,并且不是少数特殊对象之一。我相信这是 C 指针指向环境的十六进制值,但在 R 级别,没有办法直接使用 C 指针。如果你用 C 语言编写代码,你也许可以使用它,但要知道它在将来的某个时候是否仍然有效是非常棘手的。只需将环境分配给 R 变量,然后使用该变量即可。