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!,但我也对其他解决方案持开放态度.

推荐答案

假设问题是,给定一个环境列表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, envirs = I(lapply(symbols, getEnvs)))
str(data)

'data.frame':   3 obs. of  2 variables:
 $ symbols: chr  "cc" "dd" "ee"
 $ envirs :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列的字符载体,则改用此:

getEnvs <- function(s) Filter(function(e) s %in% ls(e), envirs) |>
  sapply(capture.output) |>
  toString()

data <- data.frame(symbols, envirs = sapply(symbols, getEnvs))

注意

设置输入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)

R相关问答推荐

使用long()在dØr中过滤后获取元素数量

r带有参考年的两年移动平均线

在R中,如何创建时间间隔的图表?

保存shiny 的代码嗅探器:避免$ Symbol问题

在ggplot Likert条中添加水平线

无法运行通过R中的Auto.arima获得的ARIMA模型

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

检测(并替换)字符串中的数学符号

如何在ggplot 2线性图的每个方面显示每个组的误差条?

基于多列将值链接到NA

在R中使用Scale_y_Break后更改y轴标签

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

基于R中的间隔扩展数据集行

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

减go R中列表的所有唯一元素对

如何将这个小列表转换为数据帧?

循环遍历多个变量,并将每个变量插入函数R

使用列中的值来调用函数调用中应使用的其他列

用多边形替换地块点

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误