列表文件递归到R中的某个级别

时间:2018-01-17 09:17:06

标签: r

是否有一种优雅的方式将文件列表递归到某个级别? 我有一个非常复杂的文件夹结构,并且递归搜索所有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)

3 个答案:

答案 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)
}