2010-09-21 5 views
35

Alors disons que j'ai un répertoire avec un tas de fichiers .rdataChargement de plusieurs fichiers à la fois?

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

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

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

Maintenant, comment puis-je charger ces fichiers avec un seul appel?

je peux toujours faire:

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

mais pourquoi je ne peux pas faire quelque chose comme do.call(load, file_names)? Je suppose qu'aucune des fonctions d'application ne fonctionnerait car la plupart d'entre elles retourneraient des listes mais rien ne devrait être retourné, juste que ces fichiers doivent être chargés. Je ne peux pas non plus utiliser la fonction get dans ce contexte. Des idées?

Répondre

47

lapply fonctionne, mais vous devez spécifier que vous voulez que les objets chargés sur le .GlobalEnv soient chargés dans l'environnement d'évaluation temporaire créé (et détruit) par lapply.

lapply(file_names,load,.GlobalEnv) 
4

Pour ce que ça vaut la peine, ce qui précède ne fonctionne pas exactement pour moi, donc je posterai la façon dont je l'ai adapté cette réponse:

J'ai des fichiers dans folder_with_files/ qui sont préfixés par prefix_pattern_, sont tous de type .RData, et sont nommés ce que je veux qu'ils soient nommés dans mon environnement R: ex: si j'avais enregistré var_x = 5, je voudrais l'enregistrer comme prefix_pattern_var_x.Data dans folder_with_files.

-je obtenir la liste des noms de fichiers, puis générer leur chemin complet load eux, alors gsub les parties que je ne veux pas: le prenant (pour object1 à titre d'exemple) de folder_with_files/prefix_pattern_object1.RData-object1 comme objname à laquelle je vais assign l'objet stocké dans le fichier 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 réponse acceptée n'a pas fonctionné pour moi, car j'ai seulement obtenu une liste avec les noms d'objets des fichiers chargés. Mais voici ce qu'il a fait: chargé <- lapply (info, la fonction (x) {get (load (x, .GlobalEnv))}) – Wave

+0

La réponse acceptée a fonctionné pour moi. En fonction de vos chemins de fichier, vous devrez peut-être indiquer full.names = TRUE dans la fonction dir() pour que la réponse de Joshua fonctionne. –

1

Chargement de nombreux fichiers dans une fonction?

est ici une version modifiée de Joshua Ulrich's answer qui fonctionnera de façon interactive et si elles sont placées dans une fonction, en remplaçant GlobalEnv avec environment():

lapply(file_names, load, environment()) 

ou

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

Exemple de travail ci-dessous. Il écrira des fichiers dans votre répertoire de travail actuel.

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) 
Questions connexes