一次加载多个文件?

所以我们说我有一个.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) ? 我想应用程序的function都不会工作,因为他们大多数会返回列表,但没有什么应该返回,只是这些文件需要加载。 我无法得到get函数在这种情况下工作。 想法?

lapply作品,但你必须指定你想要的对象加载.GlobalEnv否则他们被加载到临时评估环境创build(和销毁)由lapply

 lapply(file_names,load,.GlobalEnv) 

上面的这些东西对我来说并不完全适合,所以我会发表我如何改编这个答案:

我有folder_with_files/中的前缀为prefix_pattern_ ,都是.RDatatypes,并且命名了我希望它们在我的R环境中被命名的名称:例如:如果我保存了var_x = 5 ,我将它保存为prefix_pattern_var_x.Datafolder_with_files

我得到了文件名的列表,然后生成完整的path来load它们,然后gsub out我不想要的部分:从folder_with_files/prefix_pattern_object1.RDataobject1作为objname (以object1为例)我将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 } ) 

在一个函数中加载多个文件?

这里是Joshua Ulrich的答案的一个修改版本,它将以交互方式工作,如果放在一个函数中,用GlobalEnvreplace为environment()

 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)