Wider context:
我想创建一个函数,列出指定函数体中的所有变量,并打印出它来自什么环境.
以下是包含来自新环境的变量的函数示例.
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
我已经达到了将所有变量存储在一个vector中:symbols <- c("cc","dd","ee")
中,使用的环境存储在第二个vector中: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>
I am committed to solving this exclusively with the base package!,但我也对其他解决方案持开放态度.