You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:33:12