如何用purrr::walk2在R Markdown中实现正确嵌套标签集?
解决R Markdown中用purrr::walk2创建嵌套标签集时h2重复的问题
核心问题出在直接用walk2遍历包含重复分类的向量时,会对每一行数据都输出一次h2标签,导致同一分类重复出现。要实现同一分类下内容合并,需要先按h2分类分组,再嵌套遍历。
示例代码实现
准备示例数据
library(tidyverse) # 构造包含重复分类的示例数据 data <- tibble( 分类 = c("分类A", "分类A", "分类B", "分类B"), 子标题 = c("子标题A1", "子标题A2", "子标题B1", "子标题B2"), 内容 = c("内容A1", "内容A2", "内容B1", "内容B2") )
错误实现(h2重复)
# 直接walk2遍历,同一分类会多次输出h2 purrr::walk2(data$分类, pmap(data[,2:3], ~ paste0("### ", ..1, "\n", ..2, "\n")), function(cat, sub_content) { cat(paste0("## ", cat, "\n")) cat(sub_content) })
正确实现(合并同一h2分类)
# 先按分类分组,再嵌套遍历 data %>% group_by(分类) %>% group_split() %>% purrr::walk(function(group) { # 仅输出一次当前分类的h2标签 cat(paste0("## ", unique(group$分类), "\n")) # 遍历当前分类下的所有子内容 purrr::pmap(group[,2:3], function(子标题, 内容) { cat(paste0("### ", 子标题, "\n")) cat(内容, "\n\n") }) })
关键逻辑说明
- 分组整理数据:用
group_by+group_split将同一分类的子标题和内容归为一组,避免重复处理分类标签。 - 嵌套遍历:外层遍历每个分类组,先输出一次h2标签;内层遍历组内的子标题和内容,输出嵌套的子标签和内容,确保同一分类下的内容都聚合在对应的h2标签下。
如果你的数据是独立向量而非数据框,也可以用split函数按h2分类分组后再遍历:
h2_vec <- c("分类A", "分类A", "分类B", "分类B") h3_vec <- c("子标题A1", "子标题A2", "子标题B1", "子标题B2") content_vec <- c("内容A1", "内容A2", "内容B1", "内容B2") # 按h2分类拆分数据 grouped_data <- split(data.frame(子标题 = h3_vec, 内容 = content_vec), h2_vec) # 遍历分组输出 purrr::walk(names(grouped_data), function(cat) { cat(paste0("## ", cat, "\n")) purrr::walk2(grouped_data[[cat]]$子标题, grouped_data[[cat]]$内容, function(h3, cnt) { cat(paste0("### ", h3, "\n")) cat(cnt, "\n\n") }) })
内容的提问来源于stack exchange,提问作者boshek
相关产品推荐
相关产品推荐

