我正在尝试在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
我尝试在envir
内明确地设置mget
到.GlobalEnv
,这似乎不是问题。
我知道我在这里缺少一些简单的东西。
答案 0 :(得分:2)
当您在函数中调用ls
和mget
时,环境不再与从顶级环境调用时的环境相同。
您可以对环境进行硬编码以搜索顶层,如下所示:
list_of_objects <- mget(ls(.GlobalEnv, pattern = "_pattern_to_find"), envir = .GlobalEnv)
您的问题是ls
没有首先返回任何对象,因此仅在envir
内设置mget
参数无济于事。
避免硬编码.GlobalEnv
的替代方法是搜索所有封闭的父帧:
mget(apropos("_pattern_to_find"), inherits = TRUE)
这将匹配模式"_pattern_to_find"
并返回封闭环境中的任何对象。