我试图在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中显式地将mget设置为.GlobalEnv,这似乎不是问题所在。
我知道我错过了一些简单的东西。
发布于 2018-03-09 15:11:04
在函数中调用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"并返回包围环境中的任何对象。
https://stackoverflow.com/questions/49196301
复制相似问题