在 R 的函数中使用 mget

Posted

技术标签:

【中文标题】在 R 的函数中使用 mget【英文标题】:using mget within a function in R 【发布时间】:2018-03-09 14:50:13 【问题描述】:

我正在尝试在 r 中编写一个简单的函数,它将在 .GlobalEnv 中搜索名称中具有特定模式的对象,然后获取该列表并将元素绑定到数据框中。

单独运行时,按预期工作:

# create sample data

df1_pattern_to_find <- data.frame(a = 1, b = 2)
df2_pattern_to_find <- data.frame(a = 3, b = 4)

# use mget to generate a list of objects

list_of_objects <- mget(ls(pattern="_pattern_to_find"))

# bind the elements together into a data frame

do.call("rbind", list_of_objects)

                    a b
df1_pattern_to_find 1 2
df2_pattern_to_find 3 4

但是,当我将上述内容包装在一个函数中时,它会返回 NULL:

gather_function <- function() 
  list_of_objects <- mget(ls(pattern="_pattern_to_find"))

  df <- do.call("rbind", list_of_objects)

  df


gather_function()

NULL

我尝试将mget 中的envir 明确设置为.GlobalEnv,但这似乎不是问题。

我知道我在这里遗漏了一些简单的东西。

【问题讨论】:

你也需要在ls中设置envir 真正的问题是,为什么这些单独的数据帧一开始就不在列表中?检查该代码的来源并避免需要mgeteapply 【参考方案1】:

当您在函数中调用 lsmget 时,环境不再与从***环境调用时相同。

您可以硬编码环境以搜索***,如下所示:

list_of_objects <- mget(ls(.GlobalEnv, pattern = "_pattern_to_find"), envir = .GlobalEnv)

您的问题是 ls 首先没有返回任何对象,因此单独在 mget 中设置 envir 参数无济于事。


避免硬编码.GlobalEnv 的另一种方法是搜索所有封闭的父框架:

mget(apropos("_pattern_to_find"), inherits = TRUE)

这将匹配模式"_pattern_to_find" 并返回封闭环境中的任何对象。

【讨论】:

完美,正是我想要的。感谢您澄清这里嵌套的环境。

以上是关于在 R 的函数中使用 mget的主要内容,如果未能解决你的问题,请参考以下文章

如何获得在(看似)嵌套环境(在 R 中)中搜索的功能?

在函数中执行 console.log 时,我得到“[object Object]”[重复]

Matlab执行 FTP 文件操作

Redis MGET性能衰减分析(转)

R语言中的基本函数使用 - 更新中

为啥不能在函数中使用“=” R 运算符?