在 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
真正的问题是,为什么这些单独的数据帧一开始就不在列表中?检查该代码的来源并避免需要mget
或eapply
。
【参考方案1】:
当您在函数中调用 ls
和 mget
时,环境不再与从***环境调用时相同。
您可以硬编码环境以搜索***,如下所示:
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的主要内容,如果未能解决你的问题,请参考以下文章