如何编写无需硬编码列名的通用flextable自定义格式化函数
解决方案
方案1:直接通过行索引定位最后一行(最通用)
你不需要判断第一列的取值,直接用输入数据的行数作为行索引即可,完全不需要硬编码任何列名,适配所有加了汇总行的表格场景:
my_table <- function(x){ require(flextable) x %>% flextable() %>% # 表头设置颜色与加粗 bg(bg = "#e05297", part = "header") %>% color(color = "white", part = "header") %>% # 直接用行号定位最后一行,无需依赖列名和列值 bold(i = nrow(x), bold = TRUE, part = "body") %>% bg(i = nrow(x), bg = "grey", part = "body") } # 测试运行正常 mtcars %>% tibble::rownames_to_column() %>% janitor::adorn_totals("row") %>% my_table()
方案2:需要判断第一列值为Total的场景
如果你需要严格匹配第一列值为Total才高亮,可通过动态构造公式解决原代码的环境解析问题:
my_table <- function(x){ require(flextable) require(rlang) first_col <- sym(colnames(x)[1]) # 注入变量构造动态判断公式 filter_cond <- inject(~!!first_col == "Total") x %>% flextable() %>% bg(bg = "#e05297", part = "header") %>% color(color = "white", part = "header") %>% bold(i = filter_cond, bold = TRUE, part = "body") %>% bg(i = filter_cond, bg = "grey", part = "body") }
原通用版代码的两个核心问题
- 语法错误:
color(color = "white", part = "header")后面的管道符%>%被注释,导致后续的bold、bg函数没有和前面的逻辑连接 - 公式环境问题:直接在公式内用
eval(sym(first_col_name))时,公式无法捕获函数内部的first_col_name变量,导致解析失败
内容的提问来源于stack exchange,提问作者cephalopod
相关产品推荐
相关产品推荐

