Загрузка сразу нескольких файлов? - PullRequest
39 голосов
/ 22 сентября 2010

Допустим, у меня есть каталог с кучей файлов .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 работать в этом контексте.Идеи?

Ответы [ 3 ]

54 голосов
/ 22 сентября 2010

lapply работает, но вы должны указать, что вы хотите, чтобы объекты загружались в .GlobalEnv, иначе они загружаются во временную среду оценки, созданную (и уничтоженную) с помощью lapply.

lapply(file_names,load,.GlobalEnv)
5 голосов
/ 26 апреля 2016

Для чего бы то ни было, вышеприведенное не сработало для меня, поэтому я опубликую, как я адаптировал этот ответ:

У меня есть файлы в folder_with_files/ с префиксом prefix_pattern_Все они имеют тип .RData и называются так, как я хочу, чтобы они назывались в моей среде R: например: если бы я сохранил 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
} )
3 голосов
/ 27 июля 2016

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

Вот модифицированная версия ответа Джошуа Ульриха , которая будет работать как в интерактивном режиме, так и в случае помещения в функцию, заменив 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...