Как получить список каталогов внутри каталога, например list.files (), но вместо этого «list.dirs ()» - PullRequest
60 голосов
/ 20 января 2011

Это может быть очень простой вопрос для кого-то - я могу использовать list.files() для получения списка файлов в данном каталоге, но если я хочу получить список каталогов, как бы я это сделал?Это как-то прямо передо мной как опция в list.files()?

Кроме того, я использую Windows, поэтому, если ответ заключается в том, чтобы раскошелиться на какую-нибудь команду Linux / unix, это не сработаетдля меня.

.NET, например, имеет метод Directory.GetFiles() и отдельный метод Directory.GetDirectories(), поэтому я подумал, что R будет иметь аналогичную пару.Заранее спасибо.

Ответы [ 7 ]

85 голосов
/ 20 января 2011

Обновление: функция list.dirs была добавлена ​​в базовый пакет в ревизии 54353, которая была включена в выпуск R-2.13.0 в апреле 2011 года.

list.dirs(path = ".", full.names = TRUE, recursive = TRUE)

Так что моя функция ниже была полезна только в течение нескольких месяцев. :)


Я не смог найти функцию base R, чтобы сделать это, но было бы довольно легко написать свою собственную, используя:

dir()[file.info(dir())$isdir]

Обновление: вот функция (теперь исправленная для комментария Тимоти Джонса):

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))
}
23 голосов
/ 08 декабря 2014

base R теперь включает функцию list.dirs , так что варианты домашнего приготовления больше не нужны.

Например:

list.dirs('.', recursive=FALSE)
16 голосов
/ 28 августа 2012

Просто чтобы обновить эту ветку:

Я вижу, что в более новой версии R (в настоящее время я использую 2.5.1), теперь в базовую установку включена функция list.dirs:

list.dirs неявно имеет all.files = TRUE, и если рекурсивный = TRUE, ответ включает в себя сам путь (при условии, что это читаемый каталог).

8 голосов
/ 20 января 2011
list.dirs <- function(...) {
    x <- dir(...)
    x[file_test("-d", x)]
}

может быть полезным?

Как мы можем сделать это рекурсивно? (аргумент recursive dir нарушает эти функции, потому что он никогда не возвращает имена каталогов, только файлы в каждом каталоге и т. д.).

2 голосов
/ 29 апреля 2014

Что-то вроде этого, попробуйте:

dir('.')[file.info(dir('.',full.names=T))$isdir]
2 голосов
/ 21 января 2011

Вы упомянули, что не хотите использовать оболочку для команды Linux / UNIX, но я предполагаю, что это нормально - использовать команду Windows. В этом случае это будет сделано:

shell("dir/ad/b", intern = TRUE)

и это будет делать это рекурсивно:

shell("dir/ad/b/s", intern = TRUE)

Обычно я предпочел бы независимые от платформы решения других здесь, но особенно для интерактивного использования, где вы просто заинтересованы в том, чтобы получить ответ настолько просто и непосредственно, насколько это возможно, это может быть меньше работы.

0 голосов
/ 08 апреля 2014

У меня была эта проблема некоторое время назад, и я использовал этот рекурсивный код для поиска всех каталогов. Возможно, это может быть полезным?

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...