Ответ 1
lapply
работает, но вы должны указать, что хотите, чтобы объекты, загруженные в .GlobalEnv
, в противном случае они загружались во временную среду оценки, созданную (и уничтоженную) с помощью lapply
.
lapply(file_names,load,.GlobalEnv)
Итак, скажем, у меня есть каталог с кучей файлов .rdatap >
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
работать в этом контексте. Идеи?
lapply
работает, но вы должны указать, что хотите, чтобы объекты, загруженные в .GlobalEnv
, в противном случае они загружались во временную среду оценки, созданную (и уничтоженную) с помощью lapply
.
lapply(file_names,load,.GlobalEnv)
Для чего это стоит, это не помогло мне, поэтому я опубликую, как я адаптировал этот ответ:
У меня есть файлы в 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
} )
Загрузка многих файлов в функцию?
Здесь приведена измененная версия ответа Джошуа Ульриха, которая будет работать как в интерактивном режиме, так и при размещении внутри функции, заменив 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)