在R Markdown中如何按分支和科分组输出植物清单至Word文档?
解决植物物种清单分组格式化与Word导出问题
步骤1:数据预处理与格式化条目
先修正原始数据的创建方式(避免cbind强制转换所有列为字符型的问题),再处理分类群名称的斜体格式——仅将"var."之外的内容设为斜体:
library(dplyr) library(stringr) library(officer) # 创建规范的数据框 dat <- tibble( clade = c("Clade x", "Clade x", "Clade x", "Clade y", "Clade y", "Clade z", "Clade z"), family = c("FAMILY A", "FAMILY A", "FAMILY B", "FAMILY C", "FAMILY C", "FAMILY D", "FAMILY E"), taxon = c("Juniperus osteosperma", "Ephedra viridis", "Achillea millefolium", "Artemisia tridentata var. tridentata", "Iva axillaris", "Pleiacanthus spinosus", "Packera multilobata"), life_history = c("tree", "shrub", "forb", "shrub", "forb", "forb", "forb"), County = c("All counties", "WP", "WP, CK", "EU, WP, WA", "CK", "DG", "DG, CC"), non_native = c("", "", "Non-native", "", "Non-native", "", "") ) # 处理分类群的斜体格式(适配Word导出的格式对象) dat <- dat %>% mutate( # 含var.的分类群:拆分后分别格式化 formatted_taxon = str_replace_all(taxon, "(.*?)( var\\. )(.*)", function(match) { paste0(ftext(match[1], italic = TRUE), match[2], ftext(match[3], italic = TRUE)) }), # 不含var.的分类群直接全斜体 formatted_taxon = ifelse(!str_detect(taxon, "var\\."), ftext(taxon, italic = TRUE), formatted_taxon), # 组装带格式的完整条目 entry = fpar( formatted_taxon, ftext(paste0(". ", life_history, ". ", County, ". ")), ifelse(non_native != "", ftext(non_native), ftext("")) ) )
步骤2:按分支-科分组拆分数据
用group_split替代直接在for循环中使用group_by,避免参数错误的问题,同时确保每个分组仅包含对应分支和科下的物种:
# 按clade→family层级分组拆分 grouped_dat <- dat %>% group_by(clade, family) %>% group_split()
步骤3:生成带格式的Word文档
用officer包创建Word文档,遍历分组添加层级标题和对应物种条目:
# 初始化空白Word文档 doc <- read_docx() # 遍历每个分组写入内容 for (group in grouped_dat) { # 获取当前分组的分支和科名称 current_clade <- unique(group$clade) current_family <- unique(group$family) # 添加分支标题(一级标题样式) doc <- body_add_par(doc, current_clade, style = "heading 1") # 添加科标题(二级标题样式) doc <- body_add_par(doc, current_family, style = "heading 2") # 写入当前科下的所有物种条目 for (entry in group$entry) { doc <- body_add_fpar(doc, entry) } # 添加空行分隔不同分组 doc <- body_add_par(doc, "") } # 保存最终文档 print(doc, target = "州植物物种清单.docx")
关键说明
- 解决循环参数错误:通过
group_split将数据拆分为独立的分组数据框,遍历分组时仅需单个参数,避免了参数数量不匹配的问题。 - 保留斜体格式:利用
officer的ftext函数直接创建带格式的文本对象,导出到Word时可精准保留分类群的斜体样式。 - 严格分组逻辑:
group_by(clade, family)确保每个分组只包含对应分支和科的物种,不会出现内容重复的问题。
内容的提问来源于stack exchange,提问作者SageandSun
相关产品推荐
相关产品推荐

