【问题标题】:Loading many files at once?一次加载多个文件?
【发布时间】:2026-02-12 00:25:02
【问题描述】:

假设我有一个包含一堆 .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) 的事情呢? 我想应用函数都不会起作用,因为它们中的大多数会返回列表,但不应该返回任何内容,只是需要加载这些文件。我也无法让get 函数在这种情况下工作。想法?

【问题讨论】:

    标签: r


    【解决方案1】:

    lapply 有效,但您必须指定要将对象加载到.GlobalEnv,否则它们将加载到由lapply 创建(和销毁)的临时评估环境中。

    lapply(file_names,load,.GlobalEnv)
    

    【讨论】:

    • 您好,先生,由于我的RData 很大,我想通过以多核方式模仿您的方法来使用library(parallel) mclapply(c(RData1, RData2, RData3),load,.GlobalEnv, mc.cores = parallel::detectCores()),但是,这只返回加载的 RData 环境名称列表(字符)尽管加载时间很长,但可能会出现什么问题?谢谢!
    【解决方案2】:

    对于它的价值,以上内容并不完全适合我,所以我将发布我如何调整该答案:

    我在folder_with_files/ 中有以prefix_pattern_ 为前缀的文件,所有类型均为.RData,并以我希望它们在我的R 环境中命名的名称命名:例如:如果我保存了var_x = 5 ,我会将其保存为prefix_pattern_var_x.Data 中的folder_with_files

    我得到文件名列表,然后生成它们到load 它们的完整路径,然后将gsub 去掉我不想要的部分:从@ 获取它(以object1 为例) 987654330@ 到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
    } )
    

    【讨论】:

    • 接受的答案也对我不起作用,因为我只得到了一个包含已加载文件的对象名称的列表。但它是这样做的:加载
    • 接受的答案对我有用。根据您的文件路径,您可能需要在 dir() 函数中指定 full.names = TRUE 才能使 Joshua 的答案起作用。
    • @Wave 你的方法也对我有用。考虑将其添加为 anwser。
    【解决方案3】:

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

    这是 Joshua Ulrich's answer 的修改版本,它可以交互地工作,如果放在函数中,通过将 GlobalEnv 替换为 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)
    

    【讨论】: