0

由于使用以下代码出现错误,如何将容器名称转换为字符:

tenv = new.env()
evalq({    }, tenv)

y = function(myEnv) {
  print(as.character(myEnv))
}

y(tenv)

Error in as.character(myEnv) :
cannot coerce type 'environment' to vector of type 'character' 
4

2 回答 2

2

如果您只想获取传递给myEnv参数的对象的名称,那么一个常见的习惯用法是deparse(substitute( )). 函数可以写成:

y <- function(myEnv) {
  deparse(substitute(myEnv))
}

在使用中给出

> tenv = new.env()
> evalq({    }, tenv)
> y(tenv)
[1] "tenv"

[注意我没有明确print的结果deparse(substitute( )),我只是返回它并将打印留给 R 环境]

另一种方法是获取匹配的函数调用,match.call()然后从生成的语言对象中提取您想要的位。例如:

yy <- function(myEnv) {
  .call <- match.call()
  .call[[2]]
}

在使用中给出

> yy(tenv)
tenv
> yy(myEnv = tenv)
tenv
于 2013-03-30T17:44:42.953 回答
0

您不能将“容器”(环境)转换为字符串,因为环境不具有这样的属性。如果您想要存储环境并作为参数传递给 function 的变量的名称,请y使用上面@Gavin 提出的解决方案。

OTOH,如果要转储环境内容,请使用以下命令:

y = function(myEnv) {
  print(as.list(myEnv))
}

顺便说一句,我必须指出,我不明白你为什么要跑步evalq({ }, tenv)。它不会改变环境。尝试以下操作(运行命令后):

> uenv <- new.env()
> identical(as.list(uenv),as.list(tenv))
于 2013-03-30T19:12:08.003 回答