在list.dirs

时间:2017-10-26 17:03:51

标签: r loops directory

肯定是一个非常新的问题,但我如何在list.dirs函数中包含一个模式?

例如,list.files函数

Imagery=list.files(full.names=TRUE, recursive=TRUE, pattern= "*20m*.tif$")

返回名称中包含20m的所有文件,并以.tif作为扩展名。

但是当我尝试将此逻辑应用于list.dirs

directories=list.dirs(full.names = TRUE, recursive=TRUE, pattern="R10m" )

我收到此错误:

Error in list.dirs(full.names = TRUE, recursive = TRUE, pattern = "R10m") : 
unused argument (pattern = "R10m")

希望我不会错过这里明显的东西。 我的目标是获取具有名为“R10m”的文件夹的所有目录的完整路径。我有很多具有许多子目录的文件夹,并且大多数具有相似的结构。我想仅列出具有此文件夹的文件夹,并在其中列出所有tif文件。我知道我只需要list.files选项就可以得到我需要的文件,但是我需要以后的目录路径和文件名作为变量。

预先感谢您的时间,

祝你好运, 达沃尔

2 个答案:

答案 0 :(得分:4)

三种选择:

dirs <- list.dirs()
dirs <- dirs[ grepl(your_pattern, dirs) ]

dirs <- list.dirs()
dirs <- grep(your_pattern, dirs, value = TRUE)

files <- list.files(pattern = your_pattern, recursive = TRUE, include.dirs = TRUE)
dirs <- files[ file.info(files)$isdir ]

答案 1 :(得分:0)

dir不同,

list.dirs提供了该功能:

dir(path = ".", pattern = NULL, all.files = FALSE,
                full.names = FALSE, recursive = FALSE,
                ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)

在你的例子中:

directories <- dirs(full.names = TRUE, recursive=TRUE, pattern="R10m")

是的,我也觉得很奇怪,有2个基本功能列出目录,其中一个,尽管名称与list.files的相似性并不像提供相同的功能一样。如果有人知道原因,我会非常有兴趣知道。

<强>更新

在Gregor的评论之后,我决定创建一个可重现的例子来测试我的解决方案:

test_dirs <- c(
   paste0(c(1:3), "R10m", rep("a", 3)),
   paste0(c(1:3), "R200m", rep("a", 3))
)

for (test_dir in test_dirs){
   dir.create(test_dir)
}

list.dirs()
  

[1]“。” “.1R10ma”“。/ R200ma”[4]   “./2R10ma”“。{R200ma”“./ 3R10ma”[7]   “./3R200ma”“。/ sol_kit-figure”

dir()
  

[1]“1R10ma”“1R200ma”“2R10ma”“2R200ma”
  [5]“3R10ma”“3R200ma”“a1.bed”“a2.bed”
  [9]“a.bed”“solo_kit-figure”“solo_kit.md”

dir(pattern = "R10m")
# dir(pattern = "*R10m")
# also works
  

“1R10ma”“2R10ma”“3R10ma”

dir还列出了文件,因此如果模式适合文件和目录,则可能是一个问题,但我想对于大多数应用程序来说它可以正常工作。