2010-09-21 7 views
35

Así que vamos a decir que tengo un directorio con un montón de archivos .rdataCargando muchos archivos a la vez?

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

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

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

Ahora, ¿cómo puedo cargar estos archivos con una sola llamada?

Siempre se puede hacer:

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

pero por qué no puedo hacer algo como do.call(load, file_names)? Supongo que ninguna de las funciones de aplicación funcionaría porque la mayoría devolvería listas, pero no se debería devolver nada, solo que estos archivos deben cargarse. Tampoco puedo hacer que la función get funcione en este contexto. Ideas?

Respuesta

47

lapply funciona, pero debe especificar que desea que los objetos cargados en el .GlobalEnv de lo contrario se cargan en el entorno de evaluación temporal creado (y destruido) por lapply.

lapply(file_names,load,.GlobalEnv) 
4

Por lo que vale la pena, lo anterior no funcionó exactamente para mí, así que voy a publicar la forma en que me he adaptado respuesta:

Tengo archivos en folder_with_files/ que llevan el prefijo prefix_pattern_, son todos de tipo .RData, y reciben el nombre que quiero que se denominen en mi entorno R: por ejemplo: si hubiera guardado var_x = 5, lo guardaría como prefix_pattern_var_x.Data en folder_with_files.

tengo la lista de los nombres de archivo, a continuación, generar su ruta completa a load ellos, entonces gsub las partes que no quiero: que lo toman (por ejemplo object1) de folder_with_files/prefix_pattern_object1.RData a object1 como el objname a la cual voy a assign el objeto almacenado en el archivo 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

La respuesta aceptada tampoco me funcionó, ya que solo obtuve una lista con los nombres de los objetos de los archivos cargados. Pero esto es lo que hizo: cargado <- lapply (info, function (x) {get (load (x, .GlobalEnv))}) – Wave

+0

La respuesta aceptada funcionó para mí. Dependiendo de sus rutas de archivos, puede que necesite especificar full.names = TRUE en la función dir() para que la respuesta de Joshua funcione. –

1

¿Cargando muchos archivos en una función?

Así es una versión modificada de Joshua Ulrich's answer que funcione tanto de forma interactiva y si se coloca dentro de una función, mediante la sustitución de GlobalEnv con environment():

lapply(file_names, load, environment()) 

o

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

Ejemplo de trabajo a continuación. Escribirá archivos en su directorio de trabajo actual.

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) 
Cuestiones relacionadas