2010-09-21 4 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: ex: если бы я сохранил var_x = 5, я бы сохранил его как prefix_pattern_var_x.Data в folder_with_files.

я получить список имен файлов, а затем генерировать их полный путь к load их, то gsub из частей, которые я не хочу: принимая его (для object1 в качестве примера) от folder_with_files/prefix_pattern_object1.RData до 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 (info, function (x) {get (load (x, .GlobalEnv))}) – Wave

+0

Принятый ответ сработал для меня. В зависимости от ваших путей к файлу вам может потребоваться указать full.names = TRUE в функции dir() для ответа Джошуа на работу. –

1

Загрузка многих файлов в функцию?

Вот модифицированная версия 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) 
Смежные вопросы