更广泛的背景:
我想创建一个函数,列出指定函数主体中的所有变量并打印出它来自哪个环境。
下面是带有来自新环境的变量的函数示例。
g2 <- function() {
print(cc)
print(dd)
print(ee)
}
e <- new.env(parent = globalenv())
e$cc <- "Hello from the new environment"
e$dd <- "Hello from the new environment2"
environment(g2) <- e
e2 <- new.env(parent = globalenv())
e2$dd <- "Hello from the new environment"
e2$ee <- "Hello from the new environment2"
environment(g2) <- e2
我已经达到了将所有变量存储在一个向量中的地步:symbols <- c("cc","dd","ee")
在第二个向量中使用环境:envirs <- ls()[sapply(ls(), function(x) is.environment(get(x)))]
并检查变量来自哪个环境:xin <- sapply(envirs, function(x) sapply(symbols, function(y) exists(y,get(x))))
。它看起来像这样:
> xin
e e2
cc TRUE FALSE
dd TRUE TRUE
ee FALSE TRUE
和
> e
<environment: 0x00000127b2a1e1a8>
> e2
<environment: 0x00000127b2a20988>
现在我希望它看起来像这样:
Symbol Definition
1 cc <environment: 0x00000127b2a1e1a8>
2 dd <environment: 0x00000127b2a1e1a8>, <environment: 0x00000127b2a20988>
3 ee <environment: 0x00000127b2a20988>
但我不知道如何以xin
这种形式获得它。当我在所有环境中仅检查一个符号(例如“dd”)时,我设法得到以下结果:
xin <- sapply(envirs, function(x) exists("dd",get(x)))
l <- sapply(envirs[xin], function(x) get(x))
data.frame(t(sapply(l,c)))
e e2
1 <environment: 0x00000127b2a1e1a8> <environment: 0x00000127b2a20988>
我致力于通过基础包专门解决这个问题!,但我也愿意接受其他解决方案。