在 list.dirs 中包含模式

dav*_*man 9 directory loops r

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

例如,list.files 函数

Imagery=list.files(full.names=TRUE, recursive=TRUE, pattern= "*20m*.tif$")
Run Code Online (Sandbox Code Playgroud)

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

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

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

我收到此错误:

Error in list.dirs(full.names = TRUE, recursive = TRUE, pattern = "R10m") : 
unused argument (pattern = "R10m")
Run Code Online (Sandbox Code Playgroud)

希望我没有在这里遗漏一些明显的东西。我的目标是获取具有名为“R10m”的文件夹的所有目录的完整路径。我有很多文件夹,其中有很多子目录,其中大多数都具有相似的结构。我只想列出那些拥有此文件夹的文件,并在其中列出所有 tif 文件。我知道我可以只使用 list.files 选项获取我需要的文件,但我稍后需要目录路径和文件名作为变量。

预先感谢您的时间,

最好的问候,达沃

r2e*_*ans 9

三种选择:

dirs <- list.dirs()
dirs <- dirs[ grepl(your_pattern, dirs) ]
Run Code Online (Sandbox Code Playgroud)

或者

dirs <- list.dirs()
dirs <- grep(your_pattern, dirs, value = TRUE)
Run Code Online (Sandbox Code Playgroud)

或者

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


fri*_*day 5

dir,与list.dirs提供该功能不同:

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

在你的例子中:

directories <- dirs(full.names = TRUE, recursive=TRUE, pattern="R10m")
Run Code Online (Sandbox Code Playgroud)

是的,我也觉得很奇怪,有 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()
Run Code Online (Sandbox Code Playgroud)

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

dir()
Run Code Online (Sandbox Code Playgroud)

[1]“1R10ma”“1R200ma”“2R10ma”“2R200ma”
[5]“3R10ma”“3R200ma”“a1.bed”“a2.bed”
[9]“a.bed”“solo_kit-figure”“solo_kit。医学博士”

dir(pattern = "R10m")
# dir(pattern = "*R10m")
# also works
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我不确定这是否有效......“dir”不只是“list.files”的别名吗?(我也觉得很困惑)。如果您查看“dir”的代码,它只是调用“list.files”,甚至没有修改任何参数,并且结果不区分文件和文件夹。 (2认同)