更广泛的背景:
我想创建一个函数,列出指定函数主体中的所有变量并打印出它来自哪个环境。
下面是带有来自新环境的变量的函数示例。
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>
我致力于通过基础包专门解决这个问题!,但我也对其他解决方案持开放态度。
假设问题是给定一个环境列表,
envirs
,我们希望创建一个数据框,其第一列是这些环境中排序的唯一名称,第二列是一个列表,其组件是环境列表包含该行的对象名称。
# sorted char vector of unique symbol names
symbols <- envirs |> lapply(ls) |> unlist() |> unique() |> sort()
# given symbol name s get environments containing it
getEnvs <- function(s) Filter(function(e) s %in% ls(e), envirs)
data <- data.frame(symbols, I(lapply(symbols, getEnvs)))
str(data)
给予
'data.frame': 3 obs. of 2 variables:
$ symbols : chr "cc" "dd" "ee"
$ lapply.symbols..getEnvs.:List of 3
..$ :List of 1
.. ..$ :<environment: 0x0000011e5fa93b88>
..$ :List of 2
.. ..$ :<environment: 0x0000011e5fa93b88>
.. ..$ :<environment: 0x0000011e5faa6880>
..$ :List of 1
.. ..$ :<environment: 0x0000011e5faa6880>
..- attr(*, "class")= chr "AsIs"
设置输入
envirs
e <- new.env(parent = globalenv())
e$cc <- "Hello from the new environment"
e$dd <- "Hello from the new environment2"
e2 <- new.env(parent = globalenv())
e2$dd <- "Hello from the new environment"
e2$ee <- "Hello from the new environment2"
envirs <- list(e, e2)