Как получить список каталогов внутри каталога, например list.files (), но вместо этого " список.Дирс()"


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

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

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

7 51

7 ответов:

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

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

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


Я не мог найти базовую функцию 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))
}

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

например:

list.dirs('.', recursive=FALSE)

просто чтобы обновить эту тему:

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

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

list.dirs <- function(...) {
    x <- dir(...)
    x[file_test("-d", x)]
}

может быть использована?

как мы можем сделать это рекурсивно? (тег

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

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

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

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

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

Как насчет чего-то вроде этого, дайте ему попробовать:

dir('.')[file.info(dir('.',full.names=T))$isdir]

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

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
}