一次加载多个文件?

时间:2010-09-21 20:39:23

标签: r

所以,假设我有一个带有一堆.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函数在这种情况下工作。想法?

3 个答案:

答案 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.RDataobject1作为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)