如何使用kable和map将多个分组表格批量导出为PNG图像
问题解答
现有代码的错误点
- 命名逻辑错误:你在
map中调用names(.)获取文件名是完全错误的。此处遍历对象是拆分后的单个子数据框,names(.)返回的是子数据框的列名,而非你给列表设置的compound分组名,导致文件名生成逻辑完全失效。 - 列对齐参数错误:你设置的
align = c('l','l', 'c')只匹配了3列,而拆分后的子数据框共有7列(2个分类列+5个指标列),会触发表格渲染异常。 - 分组命名潜在风险:直接用
unique(table_list$compound)给拆分后的列表命名,无法保证顺序和group_split返回的分组顺序完全一致,可能出现分组和名称不匹配的问题。 - 路径兼容性问题:如果输出目录不存在,
save_kable会直接报错,需要提前判断并创建目录。
修正后可运行代码
# 依赖包加载确认 library(dplyr) library(purrr) library(kableExtra) # 提前创建输出目录,避免保存失败 output_path <- "output/final_plots/1. model performance/" if (!dir.exists(output_path)) { dir.create(output_path, recursive = TRUE) } table_list %>% group_split(compound, .keep = FALSE) %>% # 用group_keys提取分组名,保证和拆分顺序完全匹配 setNames(pull(group_keys(table_list, compound))) %>% # 改用imap遍历,可同时获取子数据框(.x)和对应的分组名(.y) imap(~save_kable( file = paste0(output_path, .y, "_table_metrics.png"), width = 6, height = 4, bs_theme = "journal", self_contained = TRUE, x = kbl(.x, booktabs = TRUE, align = c("l", "l", rep("c", 5))) %>% kable_styling() %>% add_header_above(c(" " = 2, "Metrics" = 5)) ))
内容的提问来源于stack exchange,提问作者Jhonathan
相关产品推荐
相关产品推荐

