Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Обновление: функция 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))
}

Ответ 2

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

Например:

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

Ответ 3

Просто обновить этот поток:

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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
}