所以,假设我有一个带有一堆.rdata文件的目录
file_names=as.list(dir(pattern="stock_*"))
[[1]]
[1] "stock_1.rdata"
[[2]]
[1] "stock_2.rdata"
现在,如何通过一次调用加载这些文件?
我总能做到:
for(i in 1:length(file_names)) load(file_names[[i]])
但为什么我不能做像do.call(load, file_names)
这样的事情呢?
我认为没有一个apply函数可以工作,因为它们中的大多数会返回列表但是不应该返回任何内容,只需要加载这些文件。我无法让get
函数在这种情况下工作。想法?
答案 0 :(得分:54)
lapply
有效,但您必须指定要将对象加载到.GlobalEnv
,否则它们会被加载到lapply
创建(和销毁)的临时评估环境中。
lapply(file_names,load,.GlobalEnv)
答案 1 :(得分:5)
对于它的价值,以上并不适合我,所以我将发布我如何调整答案:
我在folder_with_files/
中有prefix_pattern_
前缀的文件,都是.RData
类型的文件,并命名为我希望它们在我的R环境中命名的内容:ex:if我保存了var_x = 5
,我会将其prefix_pattern_var_x.Data
保存为folder_with_files
。
我获取了文件名列表,然后生成了load
个文件名的完整路径,然后gsub
出了我不想要的部分:接受它(object1
作为示例)从folder_with_files/prefix_pattern_object1.RData
到object1
作为objname
我将assign
对象存储在RData
文件中。
file_names=as.list(dir(path = 'folder_with_files/', pattern="prefix_pattern_*"))
file_names = lapply(file_names, function(x) paste0('folder_with_files/', x))
out = lapply(file_names,function(x){
env = new.env()
nm = load(x, envir = env)[1]
objname = gsub(pattern = 'folder_with_files/', replacement = '', x = x, fixed = T)
objname = gsub(pattern = 'prefix_pattern_|.RData', replacement = '', x = objname)
# print(str(env[[nm]]))
assign(objname, env[[nm]], envir = .GlobalEnv)
0 # succeeded
} )
答案 2 :(得分:3)
在函数中加载多个文件?
以下是Joshua Ulrich's answer的修改版本,通过将GlobalEnv
替换为environment()
,可以交互方式工作,如果放在函数中,则可以使用<{1}}:
lapply(file_names, load, environment())
或
foo <- function(file_names) {
lapply(file_names, load, environment())
ls()
}
下面的工作示例。它会将文件写入您当前的工作目录。
invisible(sapply(letters[1:5], function(l) {
assign(paste0("ex_", l), data.frame(x = rnorm(10)))
do.call(save, list(paste0("ex_", l), file = paste0("ex_", l, ".rda")))
}))
file_names <- paste0("ex_", letters[1:5], ".rda")
foo(file_names)