如何获取目录中的目录列表,如list.files(),而不是"list.dirs()"

use*_*400 64 directory r

对于某人来说,这可能是一个非常简单的问题 - 我可以用来list.files()获取给定目录中的文件列表,但是如果我想获得目录列表,我该怎么做?它在某种程度上就在我面前作为一种选择list.files()吗?

此外,我正在使用Windows,所以如果答案是支持某些Linux/unix命令,那对我来说无效.

.NET例如有一个Directory.GetFiles()方法和一个单独的Directory.GetDirectories() 方法,所以我认为R会有一个类似的对.提前致谢.

Jos*_*ich 93

更新:list.dirs在版本54353中的基础软件包中添加了一个功能,该功能包含在2011年4月的R-2.13.0版本中.

list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
Run Code Online (Sandbox Code Playgroud)

所以下面我的功能只用了几个月.:)


我找不到一个基本的R函数来做这个,但用自己编写自己很容易:

dir()[file.info(dir())$isdir]
Run Code Online (Sandbox Code Playgroud)

更新:这是一个功能(现已更正Timothy Jones的评论):

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))
}
Run Code Online (Sandbox Code Playgroud)


jba*_*ums 27

baseR现在包含一个list.dirs功能,因此不再需要自制的变体.

例如:

list.dirs('.', recursive=FALSE)
Run Code Online (Sandbox Code Playgroud)


Tal*_*ili 16

只是为了更新这个帖子:

我看到在较新版本的R(目前我正在使用2.5.1)中,现在list.dirs基本安装中包含一个函数:

list.dirs隐式地具有all.files = TRUE,并且如果recursive = TRUE,则答案包括路径本身(假设它是可读目录).


Rei*_*son 8

list.dirs <- function(...) {
    x <- dir(...)
    x[file_test("-d", x)]
}
Run Code Online (Sandbox Code Playgroud)

可能有用吗?

我们怎么可能递归地做这件事?(打破这些函数的recursive参数dir因为它永远不会返回目录名,只返回每个目录中的文件等等).

  • @ user297400如果它不适合你,你不应该接受我的答案是正确的. (3认同)