对于某人来说,这可能是一个非常简单的问题-我可以使用它list.files()
来获取给定目录中的文件列表,但是如果我想获取目录列表,我该怎么做?作为我的选择,它摆在我面前list.files()
吗?
另外,我正在使用Windows,因此,如果答案是要使用Linux / unix命令,那对我来说将不起作用。
例如Directory.GetFiles()
,.NET有一个方法和一个单独的Directory.GetDirectories()
方法,所以我认为R具有类似的对。提前致谢。
Answers:
更新:list.dirs
2011年4月发布的R-2.13.0版本中向版本54353的基本程序包中添加了一个功能。
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))
}
list.files
并dir
没有列出它发现作为单独的“文件”的任何目录,而是,R列出的任何文件中发现内的目录。由于所有这些都是文件而不是目录,因此您的函数返回的向量为NA
只是为了更新此线程:
我看到在R的较新版本中(当前我使用的是2.5.1),list.dirs
基本安装中现在包含一个函数:
list.dirs隐式具有all.files = TRUE,如果递归= TRUE,则答案包括路径本身(假设它是可读目录)。
all.files=TRUE
上班,只是没有显示完整的路径。
list.dirs()
是现在获得此的最佳方法。
list.dirs <- function(...) {
x <- dir(...)
x[file_test("-d", x)]
}
可能有用吗?
我们怎么可能递归地做到这一点?(recursive
参数参数dir
破坏了这些功能,因为它从不返回目录名,仅返回每个目录中的文件,等等)。
我前一段时间遇到这个问题,并使用此递归代码查找所有目录。也许这有用吗?
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
}