我有一组 .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
,其中每一列都是我要排序的变量。然后,我会使用sort
或order
函数。请参阅此处了解排序函数的工作原理。这也避免了 for 循环。