是否有一种优雅的方式将文件列表递归到某个级别?
我有一个非常复杂的文件夹结构,并且递归搜索所有xml
文件需要几秒钟。对我来说,仅搜索到某个级别就足够了,但我开发的代码看起来很难看,我想知道是否有更优雅的方式。例如,搜索到第4级会变得难看......
list.files(c(list.dirs(recursive=FALSE), # first level
list.dirs(list.dirs(recursive=FALSE), recursive=FALSE)), # second level
pattern='\\.xml$',
full.names=TRUE,
recursive=FALSE)
答案 0 :(得分:1)
为了优雅,我会编写一个带有n
参数的小型递归实用程序,您可以在之后使用它。例如。类似的东西:
list.dirs.depth.n <- function(p, n) {
res <- list.dirs(p, recursive = FALSE)
if (n > 1) {
add <- list.dirs.depth.n(res, n-1)
c(res, add)
} else {
res
}
}
list.dirs.depth.n(".", n = 3)
然后在致电list.files
答案 1 :(得分:1)
这是使用Sys.glob
的一种方式:
getFiles <- function(ext, depth){
wildcards <- Reduce(
file.path, x = rep("*", depth), init = paste0("*.", ext),
right = TRUE, accumulate = TRUE
)
Sys.glob(wildcards)
}
getFiles("xml", 4)
答案 2 :(得分:0)
此示例与递归解决方案 #1 非常相似,但它是针对文件完成的。
lfbl=function(pattern,level=1){
if(!exists("lof")) lof=vector("character",0)
temp=list.files(pattern=pattern,no..=T)
if(!is.na(temp[1])) lof=c(lof,paste0(getwd(),"/",temp))
if(level>0){
dirf=list.dirs(full.names=F,recursive=F)
for(i in dirf){
setwd(i)
lof=c(lof,lfbl(pattern,level-1))
setwd("..")
}
}
return(lof)
}