代码之家  ›  专栏  ›  技术社区  ›  Maiasaura

一次加载多个文件?

r
  •  39
  • Maiasaura  · 技术社区  · 15 年前

    假设我有一个目录,里面有一堆.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 回复  |  直到 15 年前
        1
  •  62
  •   Joshua Ulrich    15 年前

    lapply 可以,但必须指定要将对象加载到 .GlobalEnv 否则,它们将被加载到由创建(并销毁)的临时评估环境中 拉普拉

    lapply(file_names,load,.GlobalEnv)
    
        2
  •  6
  •   Moderat    10 年前

    值得一提的是,以上这些并不完全适合我,所以我将发布我是如何适应这个答案的:

    folder_with_files/ 前缀为 prefix_pattern_ ,都是类型 .RData var_x = 5 ,我会把它保存为 prefix_pattern_var_x.Data 在里面 folder_with_files .

    load 那么,他们呢 gsub 把我不想要的部分拿出来 object1 例如)来自 folder_with_files/prefix_pattern_object1.RData 目标1 作为 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
    } )
    
        3
  •  3
  •   Community Mohan Dere    9 年前

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

    这是一个修改过的版本 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)