如何用gt::gt()根据其他列条件覆盖单元格显示文本?
使用gt包基于其他列条件覆盖单元格显示值的解决方案
要在不修改底层数值数据的前提下,根据另一列的条件替换单元格显示内容,同时保留表格的筛选和排序功能,可以使用gt::text_transform()函数——它支持在格式化单元格时引用同一行的其他列数据,完美解决fmt()只能处理当前列的限制。
修改后的代码示例
library(tibble) library(gt) data <- tribble( ~display, ~override, 0.8, NA_character_, 0.3, NA_character_, 1, "x", 1, NA_character_, 0, "y", 0, NA_character_ ) data %>% gt() %>% data_color(display, palette = "PuBu") %>% fmt_percent(display, decimals = 0) %>% # 根据override列的值替换display列的显示内容 text_transform( locations = cells_body(columns = display), fn = function(x, row) { dplyr::case_when( row$override == "x" ~ "✓", row$override == "y" ~ "✗", # 可根据需求自定义显示内容 TRUE ~ x # 其他情况保留原格式化后的内容 ) } ) %>% tab_style(style = list(cell_fill("green4")), locations = cells_body(columns = display, rows = override == "x")) %>% tab_style(style = list(cell_fill("red3")), locations = cells_body(columns = display, rows = override == "y"))
关键说明
text_transform()的fn参数可以接收两个参数:x是当前列(这里是display)已经格式化后的内容,row是当前行的所有数据,因此可以直接调用row$override来判断条件。- 通过
case_when()设置多条件规则:当override == "x"时显示✓,override == "y"时显示✗(可按需调整),其他情况保留原百分比格式的内容。 - 底层的
display列数值未被修改,因此表格的筛选、排序功能完全不受影响,依然基于原始数值运行。
内容的提问来源于stack exchange,提问作者Mark Rieke
相关产品推荐
相关产品推荐

