如何从数据框列表输出带单元格格式的booktabs风格kable表格?
问题原因与解决办法
核心问题
booktabs参数适用范围错误:booktabs = TRUE是LaTeX格式表格专属的样式参数,你当前调用kable("html", ...)生成的是HTML表格,这个参数对HTML完全无效,自然不会生效。- 单元格条件判断变量错误:
cell_spec里的ifelse(.x==1)中,.x指代的是整个数据框对象,不是当前单元格的数值,应该用.来表示当前单元格的值。
解决方案
情况1:输出HTML格式表格(保留单元格着色,添加简洁风格)
HTML表格无法直接使用booktabs,可通过kableExtra的kable_styling()添加类似的简洁分隔线风格,同时修正条件判断逻辑:
library(tidyverse) library(knitr) library(kableExtra) df1 <- data.frame("2016"=c(0,0,1,1), "2017"=c(1,1,1,1), "2018"=c(0,0,1,0), "2019"=c(1,0,0,0)) df2 <- data.frame("2016"=c(0,1,0,1), "2017"=c(1,0,0,1), "2018"=c(1,0,1,0), "2019"=c(1,0,1,1)) rownames(df1) <- c("sp1", "sp2", "sp3", "sp4") rownames(df2) <- c("sp1", "sp2", "sp3", "sp4") df.list <- list(df1,df2) # 修正后的代码 walk(df.list, function(df) { df %>% mutate(across(everything(), ~cell_spec(., "html", background = ifelse(. == 1, "red", "white"), color = ifelse(. == 1, "red", "white")))) %>% kable("html", escape = FALSE) %>% # 添加HTML表格的简洁风格,替代booktabs kable_styling(full_width = FALSE, bootstrap_options = "clean", font_size = 12) %>% print() })
注:这里用walk替代map,因为我们只需要打印输出不需要返回值;kable_styling的参数可按需调整,比如"clean"风格最接近booktabs的简洁感。
情况2:输出LaTeX格式表格(启用booktabs样式)
如果你的Rmarkdown输出格式是PDF(基于LaTeX),可以将kable格式改为"latex",同时修正条件判断并启用booktabs:
walk(df.list, function(df) { df %>% mutate(across(everything(), ~cell_spec(., "latex", background = ifelse(. == 1, "red", "white"), color = ifelse(. == 1, "red", "black")))) %>% kable("latex", escape = FALSE, booktabs = TRUE) %>% kable_styling(latex_options = "booktabs") %>% print() })
此时需确保LaTeX环境支持xcolor包(一般默认包含)。
内容的提问来源于stack exchange,提问作者Pedro Neves
相关产品推荐
相关产品推荐

