2010-09-21 68 views
35

所以我們可以說我有一堆.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函數在這種情況下工作。想法?

回答

47

lapply工作,但您必須指定您希望對象加載到.GlobalEnv,否則它們將被加載到由lapply創建(並銷燬)的臨時評估環境中。

lapply(file_names,load,.GlobalEnv) 
4

對於它的價值,上面並沒有完全爲我工作,所以我會後我如何適應這個問題的答案:

我有文件folder_with_files/prefix_pattern_前綴,都是的.RData類型,並且命名爲我希望它們在我的R環境中被命名:例如:如果我保存了var_x = 5,我將它保存爲prefix_pattern_var_x.Datafolder_with_files中。

我得到的文件名列表,然後生成自己的完整路徑load他們,然後gsub的是,我不想要的部分:從folder_with_files/prefix_pattern_object1.RData把它(爲object1爲例),以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 
}) 
+0

接受的答案也不適用於我,因爲我只有一個列表與加載的文件的對象名稱。但是,它是什麼:加載< - lapply(信息,功能(X){獲得(負載(X,.GlobalEnv)))) – Wave 2017-03-28 12:33:02

+0

接受的答案爲我工作。根據您的文件路徑,您可能需要在dir()函數中爲Joshua的工作答案指定full.names = TRUE。 – 2017-04-19 13:50:01

1

在函數中加載很多文件?

這裏是Joshua Ulrich's answer修改後的版本,將工作既交互,如果放在一個函數中,通過與environment()更換GlobalEnv:下面

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)