如何使用Flextable根据单元格值为动态命名列添加脚注
解决方案
核心问题:flextable的footnote()方法对i参数的解析逻辑和bg()方法不同,当你为多列批量添加脚注时,i需要传入和目标列长度匹配的行索引列表,你之前传入公式列表的写法无法被正确识别。
你只需要修改to.table函数中脚注相关的逻辑即可,完整修改后的代码如下:
library(tidyverse) library(rlang) library(flextable) # 原代码漏了该依赖加载,补充避免运行报错 a <- as_tibble(x =cbind( Year = c(2018, 2019, 2020), a = 1:3, b.1 = c("a", "b", "c"), b.2 = c("c", "b", "a"), fac = c("This", "This","That"))) %>% mutate(across(Year:a, ~as.numeric(.)), across(where(is.character), ~ as.factor(.))) foo <- function(x, y, z, ...){ y_var <- enquo(y) x %>% filter(Year %in% c(2019, 2020), ...) %>% mutate(!!quo_name(y_var) := factor(!!y_var, levels = z, ordered = TRUE)) %>% arrange(!!y_var) } to.table <- function(x, y, z, ...){ y_var <- enquo(y) df.in <- foo(x=x, y=!!y_var, z= z) cond <- as.formula(glue::glue('~ !is.na({quo_name(y_var)})')) #Columns to evaluate cols.eval <- names(df.in)[startsWith(names(df.in), prefix = "b")] # 新增:预计算每个b列下值为c的行索引 rows_with_c <- lapply(cols.eval, function(col) which(df.in[[col]] == "c")) bg_picker <- scales::col_factor( domain = c("a", "b", "c"), palette = c("green", "white", "Red3"), levels = c("a", "b", "c"), ordered = TRUE ) flextable(df.in) %>% bold(i = cond, part = "body") %>% bg(j = cols.eval, bg = bg_picker) %>% footnote(j = cols.eval, i = rows_with_c, # 替换为预计算的行索引列表 value = as_paragraph("This is the first footnote"), ref_symbols = "a", part = "body", inline = TRUE) } to.table(x=a, y=Year, z= c(2020,2018,2019), fac == "This")
运行后所有值为c的b.*列单元格都会正确添加脚注标识,符合需求。
内容的提问来源于stack exchange,提问作者Reed
相关产品推荐
相关产品推荐

