从函数中提取变量以及它们来自 R 中的哪些环境?

问题描述 投票:0回答:1

更广泛的背景:

我想创建一个函数,列出指定函数主体中的所有变量并打印出它来自哪个环境。

下面是带有来自新环境的变量的函数示例。

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>

我致力于通过基础包专门解决这个问题!,但我也对其他解决方案持开放态度。

r
1个回答
0
投票

假设问题是给定一个环境列表,

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)
© www.soinside.com 2019 - 2024. All rights reserved.