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
}
推荐阅读
- mvvm - Xamarin.Forms 控件模板绑定不起作用
- android - 是否有必要在 android 应用上使用 com.google.android.gms.ads.AdActivity ?
- haskell - % 在 Haskell 中做了什么?
- azure-webjobs - 有没有办法以编程方式从 WebJob 中的另一个函数调用 WebJob 函数并且仍然具有输出绑定工作?
- php - $Order 访问受保护的数组
- python - 破折号:执行触发功能时的“锁定”按钮
- spring-boot - 如何使用 Spring Boot 正确设置 JDBC 控制器类?
- testing - cygwin jest 和 git 的“--watch 不支持没有 git/hg”
- c# - foreach 语句不能对“IContainer”类型的变量进行操作
- bash - 错误:(gcloud.services.enable)用户没有访问项目的权限(或者它可能不存在):调用者没有权限