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.

 51
Author: jbaums, 2011-01-20

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))
}
 70
Author: Joshua Ulrich,
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)
 19
Author: jbaums,
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).

 16
Author: Tal Galili,
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...).

 8
Author: Gavin Simpson,
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.

 2
Author: G. Grothendieck,
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]
 2
Author: FranciscoA,
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
}
 -1
Author: David O,
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