通过按文件权重对目录和子目录进行排序,在 R 中生成文件树

  • 本文关键字:文件 排序 子目录 权重 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 循环来做到这一点。

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

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
}

但正在为它的本质而苦苦挣扎;特别是如何避免使用重复嵌套的 for 循环来做到这一点。

使用apply系列中的一个函数。这样,就可以避免 for 循环。对不起,但我不能帮你更多,因为你没有发布到目前为止的代码。

也就是说,我会做一个data frame,其中每一列都是我要排序的变量。然后,我会使用sortorder函数。请参阅此处了解排序函数的工作原理。这也避免了 for 循环。

最新更新