Cela peut être une question très simple pour quelqu'un - je peux utiliser list.files()
pour obtenir une liste de fichiers dans un répertoire donné, mais si je veux obtenir une liste de répertoires, comment dois-je faire? Est-il en quelque sorte juste devant moi en tant qu'option dans list.files()
?
De plus, j'utilise Windows, donc si la réponse est de décortiquer une commande Linux/unix, cela ne fonctionnera pas pour moi.
.NET par exemple a une méthode Directory.GetFiles()
, et une méthode Directory.GetDirectories()
distincte, donc j'ai pensé que R aurait une paire analogue. Merci d'avance.
Mise à jour: A list.dirs
La fonction a été ajoutée au package de base dans la révision 54353, qui a été incluse dans la version R-2.13.0 en avril 2011.
list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
Donc ma fonction ci-dessous n'a été utile que pendant quelques mois. :)
Je n'ai pas trouvé de fonction R de base pour le faire, mais il serait assez facile d'écrire la vôtre en utilisant:
dir()[file.info(dir())$isdir]
Mise à jour: voici une fonction (maintenant corrigée pour le commentaire de Timothy Jones):
list.dirs <- function(path=".", pattern=NULL, all.dirs=FALSE,
full.names=FALSE, ignore.case=FALSE) {
# use full.names=TRUE to pass to file.info
all <- list.files(path, pattern, all.dirs,
full.names=TRUE, recursive=FALSE, ignore.case)
dirs <- all[file.info(all)$isdir]
# determine whether to return full names or just dir names
if(isTRUE(full.names))
return(dirs)
else
return(basename(dirs))
}
base
R inclut désormais un list.dirs
function , donc les variantes maison ne sont plus nécessaires.
Par exemple:
list.dirs('.', recursive=FALSE)
Juste pour mettre à jour ce fil:
Je vois que dans la nouvelle version de R (actuellement j'utilise 2.5.1), il y a maintenant un list.dirs
fonction incluse dans l'installation de base:
list.dirs a implicitement all.files = TRUE, et si récursif = TRUE, la réponse inclut le chemin lui-même (à condition qu'il s'agisse d'un répertoire lisible).
list.dirs <- function(...) {
x <- dir(...)
x[file_test("-d", x)]
}
pourrait être utile?
Comment pourrions-nous procéder de manière récursive? (l'argument recursive
de dir
casse ces fonctions car il ne retourne jamais les noms de répertoire, juste les fichiers de chaque répertoire, etc ...).
Qu'en est-il de quelque chose comme ça, essayez-le:
dir('.')[file.info(dir('.',full.names=T))$isdir]
Vous mentionnez que vous ne voulez pas décortiquer vers une commande Linux/UNIX mais je suppose que c'est ok pour décortiquer vers une commande Windows. Dans ce cas, cela suffirait:
Shell("dir/ad/b", intern = TRUE)
et cela le ferait récursivement:
Shell("dir/ad/b/s", intern = TRUE)
Normalement, je préférerais les solutions indépendantes de la plate-forme d'autres ici, mais en particulier pour une utilisation interactive où vous souhaitez simplement obtenir la réponse aussi simplement et directement que possible, cela peut être moins de travail.