2010-09-21 38 views
35

Vì vậy, chúng ta hãy nói rằng tôi có một thư mục với một loạt các file .rdataTải nhiều tệp cùng một lúc?

file_names=as.list(dir(pattern="stock_*")) 

[[1]] 
[1] "stock_1.rdata" 

[[2]] 
[1] "stock_2.rdata" 

Bây giờ, làm thế nào để tải những tập tin này với một cuộc gọi duy nhất?

tôi luôn luôn có thể làm:

for(i in 1:length(file_names)) load(file_names[[i]]) 

nhưng tại sao tôi không thể làm điều gì đó như do.call(load, file_names)? Tôi cho rằng không có hàm nào áp dụng sẽ hoạt động vì hầu hết các hàm này sẽ trả về danh sách nhưng không có gì phải trả về, chỉ cần tải các tệp này. Tôi cũng không thể nhận hàm get để làm việc trong ngữ cảnh này. Ý tưởng?

Trả lời

47

lapply hoạt động, nhưng bạn phải chỉ định rằng bạn muốn các đối tượng được tải vào .GlobalEnv nếu không chúng được tải vào môi trường đánh giá tạm thời được tạo (và bị hủy) bởi lapply.

lapply(file_names,load,.GlobalEnv) 
4

Đối với những gì nó có giá trị, bên trên không chính xác làm việc đối với tôi, vì vậy tôi sẽ đăng làm thế nào tôi thích câu trả lời rằng:

tôi có tác phẩm trong folder_with_files/ đó được bắt đầu bởi prefix_pattern_, tất cả đều của loại .RData, và được đặt tên những gì tôi muốn chúng được đặt tên trong môi trường R của tôi: ví dụ: nếu tôi đã lưu var_x = 5, tôi sẽ lưu nó dưới dạng prefix_pattern_var_x.Data trong folder_with_files.

tôi nhận được danh sách tên tập tin, sau đó tạo ra đường dẫn đầy đủ của họ để load chúng, sau đó gsub ra những phần mà tôi không muốn: lấy nó (ví object1 là một ví dụ) folder_with_files/prefix_pattern_object1.RData-object1 như objname mà tôi sẽ assign đối tượng được lưu trữ trong tệp 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

Câu trả lời được chấp nhận cũng không có tác dụng đối với tôi vì tôi chỉ có danh sách có tên đối tượng của các tệp đã tải. Nhưng đây là những gì đã làm nó: nạp <- lapply (thông tin, chức năng (x) {get (load (x, .GlobalEnv))}) – Wave

+0

Câu trả lời được chấp nhận làm việc cho tôi. Tùy thuộc vào đường dẫn tệp của bạn, bạn có thể cần phải chỉ định full.names = TRUE trong hàm dir() cho câu trả lời của Joshua để làm việc. –

1

Tải nhiều tệp trong một hàm?

Dưới đây là một phiên bản sửa đổi của Joshua Ulrich's answer rằng sẽ làm việc cả hai cách tương tác và nếu đặt trong một hàm, bằng cách thay thế GlobalEnv với environment():

lapply(file_names, load, environment()) 

hoặc

foo <- function(file_names) { 
    lapply(file_names, load, environment()) 
    ls() 
} 

dụ làm việc bên dưới. Nó sẽ ghi các tập tin vào thư mục làm việc hiện tại của bạn.

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) 
Các vấn đề liên quan