一次加载多个文件?
所以我们说我有一个.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_
,都是.RData
types,并且命名了我希望它们在我的R环境中被命名的名称:例如:如果我保存了var_x = 5
,我将它保存为prefix_pattern_var_x.Data
在folder_with_files
。
我得到了文件名的列表,然后生成完整的path来load
它们,然后gsub
out我不想要的部分:从folder_with_files/prefix_pattern_object1.RData
到object1
作为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的答案的一个修改版本,它将以交互方式工作,如果放在一个函数中,用GlobalEnv
replace为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)