如何在Shiny应用的formattable表格中显示NA为'-'并保留数值着色?
解决formattable中NA显示为'-'且保留数值着色的问题
完全可以实现这个需求,核心是只修改NA的显示文本,保留原始数值用于着色计算,而非直接替换NA为字符(那样会丢失数值信息,无法应用颜色逻辑)。
解决方案代码
library(formattable) example <- structure(list(`2022` = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), `2021` = c(929L, NA, 165L, 265L, 5616L, 13L), `2020` = c(660L, NA, 98L, 266L, 6735L, 15L), `2019` = c(598L, NA, 96L, 326L, 6236L, 14L), `2018` = c(479L, NA, 107L, 384L, 4486L, 14L), `2017` = c(NA, NA, -547L, -3548L, 3895L, 20L), `2016` = c(NA, NA, 19L, 535L, 6345L, 24L)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) # 自定义格式化函数:兼顾NA显示与数值着色 custom_formatter <- formatter("span", # 基于原始数值生成背景色 style = ~ style(background = color_tile("#DeF7E9", "#71CA97")(.)), # 替换NA的显示文本为'-' x = ~ ifelse(is.na(.), "-", .) ) formattable(example, list( row.names = formatter("span", style = ~ style(color = "black", font.weight = "bold")), area(col = 1:7) ~ custom_formatter ))
关键说明
- 着色逻辑保留:
color_tile("#DeF7E9", "#71CA97")(.)直接使用原始数值(包括NA)计算背景色,和你原本的着色逻辑完全一致,NA会被color_tile自动忽略,显示为数值范围中的浅色。 - NA文本替换:通过
x = ~ ifelse(is.na(.), "-", .)只修改单元格的显示内容,不改变原始数据类型,因此着色逻辑不受影响。
可选优化:自定义NA的背景色
如果你想让NA单元格的背景色和数值单元格区分开,可以修改style部分,单独给NA设置背景色:
custom_formatter <- formatter("span", style = ~ style( background = ifelse(is.na(.), "#f5f5f5", color_tile("#DeF7E9", "#71CA97")(.)) ), x = ~ ifelse(is.na(.), "-", .) )
内容的提问来源于stack exchange,提问作者Bloxx
相关产品推荐
相关产品推荐

