Как получить список каталогов внутри каталога, например list.files (), но вместо этого " список.Дирс()"
это может быть очень простой вопрос для кого - то- я могу использовать list.files()
чтобы получить список файлов в данном Каталоге, но если я хочу получить список каталогов, как бы я это сделал? Это как-то прямо передо мной как вариант внутри list.files()
?
кроме того, я использую Windows, поэтому, если ответ заключается в том, чтобы выложить какую-то команду Linux/unix, это не сработает для меня.
.NET например имеет Directory.GetFiles()
метод, и отдельной Directory.GetDirectories()
метод, поэтому я решил R была бы аналогичная пара. Спасибо заранее.
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 }