如何在R的formattable/DT中为非数值Name值添加单元格颜色?
给Name列不同非数值值设置不同背景色的可行方案
别着急,不管是formattable还是DT,都能实现你要的给Name列不同非数值值设置不同单元格背景色的需求,下面是两种工具的具体实现方案:
方案一:使用formattable实现
我们可以自定义一个格式化函数,给每个Name值映射对应的背景色,然后应用到表格中:
library(formattable) # 你的原始数据 DF <- data.frame( Ticker=c("", "", "", "IBM", "AAPL", "MSFT"), Name=c("Dow Jones", "S&P 500", "Technology", "IBM", "Apple", "Microsoft"), Value=c(15988.08, 1880.33, NA, 130.00, 97.05, 50.99), Change=c(-0.0239, -0.0216, 0.021, -0.0219, -0.0248, -0.0399) ) # 给每个Name值定义专属背景色(你可以自己替换成喜欢的颜色) name_colors <- c( "Dow Jones" = "#FFE4E1", "S&P 500" = "#E6F7FF", "Technology" = "#FFF7E6", "IBM" = "#F0F5FF", "Apple" = "#FFF0F5", "Microsoft" = "#E6FFE6" ) # 自定义格式化函数,根据Name值匹配背景色 color_name <- function(x) { style(x, background = name_colors[x]) } # 生成带背景色的formattable表格 formattable(DF, list( Name = color_name ))
补充说明
- 你可以完全自定义
name_colors里的颜色值,换成任何你想要的十六进制颜色码 - 如果Name值是动态生成的(不确定有多少个不同值),可以用自动生成颜色的方式,比如结合
RColorBrewer包:
library(RColorBrewer) unique_names <- unique(DF$Name) name_colors <- setNames(brewer.pal(length(unique_names), "Set3"), unique_names)
方案二:使用DT实现
DT的formatStyle配合styleEqual函数可以轻松实现值与样式的映射:
library(DT) # 你的原始数据 DF <- data.frame( Ticker=c("", "", "", "IBM", "AAPL", "MSFT"), Name=c("Dow Jones", "S&P 500", "Technology", "IBM", "Apple", "Microsoft"), Value=c(15988.08, 1880.33, NA, 130.00, 97.05, 50.99), Change=c(-0.0239, -0.0216, 0.021, -0.0219, -0.0248, -0.0399) ) # 定义Name值与背景色的映射 name_colors <- c( "Dow Jones" = "#FFE4E1", "S&P 500" = "#E6F7FF", "Technology" = "#FFF7E6", "IBM" = "#F0F5FF", "Apple" = "#FFF0F5", "Microsoft" = "#E6FFE6" ) # 生成DT表格并设置背景色样式 datatable(DF) %>% formatStyle( "Name", backgroundColor = styleEqual(names(name_colors), name_colors) )
补充说明
styleEqual函数的第一个参数是要匹配的Name值,第二个参数是对应的样式(这里是背景色)- 同样支持自动生成颜色的方式,和上面formattable的自动生成逻辑一致
内容的提问来源于stack exchange,提问作者user10624646
相关产品推荐
相关产品推荐

