如何在flextable中按行而非整列实现条件格式设置
问题原因
这个报错是因为bg()函数接收函数作为背景色参数时,默认会将指定列的全部行数据传入映射函数,而不是仅传入i参数筛选的行数据。scales::col_numeric返回的函数会生成与输入数据等长的颜色向量,本示例中全列共6行数据返回6个颜色值,你要赋值给2行的单元格,长度不匹配就触发了替换长度不兼容的报错。
解决方法
直接手动提取你需要设置格式的单元格数值,传入颜色映射函数得到对应长度的颜色向量,再传给bg()的bg参数即可,示例代码如下:
library(flextable) library(scales) ft_2 <- flextable(head(iris)) # 定义颜色映射规则,这里domain固定为0-7和原示例一致 colourer <- col_numeric( palette = c("wheat", "red"), domain = c(0, 7)) # 提取指定行、指定列的所有数值,转为一维向量 j_cols <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") target_values <- as.vector(as.matrix(ft_2$body$dataset[1:2, j_cols])) # 传入生成好的颜色向量 ft_2 <- bg(ft_2, i = 1:2, j = j_cols, bg = colourer(target_values)) # 查看结果 ft_2
如果你的颜色映射基准需要基于全表数据自动计算,不需要手动指定domain,可以在定义colourer的时候先计算全表对应列的数值范围:
# 基于全表数值设置映射范围 colourer <- col_numeric( palette = c("wheat", "red"), domain = range(ft_2$body$dataset[, j_cols]))
这样设置后,选中行的颜色映射逻辑和全表应用格式时完全一致,不会出现颜色基准偏移的问题。
内容的提问来源于stack exchange,提问作者cavamic
相关产品推荐
相关产品推荐

