首页 > 解决方案 > 通过按文件权重对目录和子目录进行排序,在 R 中生成文件树

问题描述

我有一组 .rmd 文件,我想将它们排序到一个列表中。我正在使用文件权重(在文件 YAML 标头中定义)来指示该文件相对于其邻居的所需位置。

示例目录结构:

.
├── dir1
│   ├── dir3
│   │   ├── index.rmd (weight: 1)
│   │   └── file5.rmd (weight: 1)
│   ├── index.rmd (weight: 1)
│   └── file4.rmd (weight: 1)
├── dir2
│   ├── index.rmd (weight: 2)
│   ├── file6.rmd (weight: 1)
│   └── file7.rmd (weight: 2)
├── index.rmd (weight: 1)
├── file2.rmd (weight: 2)
└── file3.rmd (weight: 3)

目标是按权重顺序生成文件列表,从目录开始,.然后按权重顺序遍历目录(由其索引的权重和父级的权重确定)。例如,对于上述目录,顺序为:

./index.rmd
./file2.rmd
./file3.rmd
dir1/index.rmd
dir1/file4.rmd
dir1/dir3/index.rmd
dir1/dir3/file5.rmd
dir2/index.rmd
dir2/file6.rmd
dir2/file7.rmd

list.files(filetree, '[.]Rmd$', ignore.case = TRUE, recursive = TRUE)我可以分别用或生成文件或目录的列表unique(dirname(files)),并且可以用 或 访问权重,yaml_front_matter(filename)$weight但我正在努力解决它的问题;特别是如何避免重复嵌套的 for 循环这样做。

标签: r

解决方案


听起来您可能需要在这里使用递归函数。这是一个返回单个数据框的文件,其中包含所有相关文件路径和文件权重:

get_file_listing <- function(folder, pattern = "*[.]Rmd$")
{
  subdirs <- list.dirs(folder, recursive = FALSE, full.names = FALSE)
  result  <- list.files(folder, full.names = TRUE, pattern = pattern)
  weights <- sapply(result, function(x) yaml_front_matter(x)$weight)
  new_rows <- data.frame(file = result, weights, stringsAsFactors = FALSE)

  for(i in subdirs) {
    new_path <- paste0(folder, "/", i)
    new_rows <- rbind(new_rows, get_file_listing(new_path, pattern))
  }
  new_rows
}

推荐阅读