Jak uzyskać listę katalogów w katalogu, np. list.files (), ale zamiast tego " list.dirs()"
To może być bardzo proste pytanie dla kogoś - jestem w stanie użyć list.files()
, aby uzyskać listę plików w danym katalogu, ale jeśli chcę uzyskać listę katalogów, jak to zrobić? Czy jest to w jakiś sposób przede mną jako opcja w list.files()
?
Również używam Windows, więc jeśli odpowiedzią jest powłoka na jakieś polecenie Linux / unix, to nie będzie działać dla mnie.
. net na przykład ma metodę Directory.GetFiles()
, a oddzielny Directory.GetDirectories()
metoda, więc pomyślałem, że R będzie miał analogiczną parę. Z góry dzięki.
7 answers
Aktualizacja: Funkcja list.dirs
została dodana do pakietu podstawowego w wersji 54353, która została zawarta w wydaniu R-2.13.0 w kwietniu 2011 roku.
list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
Więc moja funkcja poniżej była przydatna tylko przez kilka miesięcy. :)
Nie mogłem znaleźć podstawowej funkcji R, aby to zrobić, ale byłoby całkiem łatwo napisać własną używając:
dir()[file.info(dir())$isdir]
Update: oto funkcja (teraz poprawiona na komentarz Timothy ' ego Jonesa):
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))
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 14:42:52
base
R zawiera teraz list.dirs
function , więc warianty warzone w domu nie są już potrzebne.
Na przykład:
list.dirs('.', recursive=FALSE)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 12:49:20
Aby zaktualizować ten wątek:
Widzę, że w nowszej wersji R (obecnie używam 2.5.1), jest teraz funkcja list.dirs
dołączona do podstawowej instalacji:
Lista.dirs bezwarunkowo ma wszystko.files = TRUE, a if recursive = TRUE, odpowiedź zawiera samą ścieżkę (pod warunkiem, że jest to czytelny katalog).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 05:29:11
list.dirs <- function(...) {
x <- dir(...)
x[file_test("-d", x)]
}
Może się przydać?
Jak możemy to zrobić rekurencyjnie? (argument recursive
dir
łamie te funkcje, ponieważ nigdy nie zwraca nazw katalogów, tylko plików w każdym katalogu, itd...).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-20 17:41:48
Wspominasz, że nie chcesz powłoki do polecenia Linux / UNIX, ale zakładam, że jego ok powłoki do polecenia Windows. W takim przypadku to by to zrobiło:
shell("dir/ad/b", intern = TRUE)
I to zrobiłoby to rekurencyjnie:
shell("dir/ad/b/s", intern = TRUE)
Normalnie wolałbym niezależne od platformy rozwiązania innych tutaj, ale szczególnie do interaktywnego użytku, gdzie po prostu chodzi o uzyskanie odpowiedzi tak prosto i bezpośrednio, Jak to możliwe, może to być mniej pracy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-20 22:49:56
A co z czymś takim, spróbuj:
dir('.')[file.info(dir('.',full.names=T))$isdir]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 03:54:34
Miałem ten problem jakiś czas temu i użyłem tego rekurencyjnego kodu, aby znaleźć wszystkie katalogi. Może to się przyda?
list.dirs <- function(parent=".") # recursively find directories
{
if (length(parent)>1) # work on first and then rest
return(c(list.dirs(parent[1]), list.dirs(parent[-1])))
else { # length(parent) == 1
if (!is.dir(parent))
return(NULL) # not a directory, don't return anything
child <- list.files(parent, full=TRUE)
if (!any(is.dir(child)))
return(parent) # no directories below, return parent
else
return(list.dirs(child)) # recurse
}
}
is.dir <- function(x) # helper function
{
ret <- file.info(x)$isdir
ret[is.na(ret)] <- FALSE
ret
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 23:11:02