Подтвердить что ты не робот

Загрузка нескольких файлов одновременно?

Итак, скажем, у меня есть каталог с кучей файлов .rdata​​p >

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 работать в этом контексте. Идеи?

4b9b3361

Ответ 1

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

lapply(file_names,load,.GlobalEnv)

Ответ 2

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

У меня есть файлы в 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
} )

Ответ 3

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

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