在R Shiny中按行列索引为Data Table多单元格设不同颜色
为DT表格的指定单元格设置不同自定义颜色
需求说明
需要为Data Table中指定行列组合的单元格分别设置不同的预定义颜色,现有批量修改单元格颜色的函数仅支持单一颜色,需结合已有的行列-颜色映射矩阵扩展功能。
修改后的解决方案
扩展后的颜色设置函数
修改原函数,新增colors参数传入每个单元格对应的颜色值,确保行列索引与颜色一一对应:
library(DT) changeCellsColor <- function(rows, cols, colors){ # 确保三个参数长度一致 stopifnot(length(rows) == length(cols), length(rows) == length(colors)) c( "function(row, data, num, index){", sprintf(" var rows = [%s];", paste0(rows-1, collapse = ",")), # R行索引转JS的0起始索引 sprintf(" var cols = [%s];", paste0(cols, collapse = ",")), sprintf(" var colors = [%s];", paste0(shQuote(colors, type = "sh"), collapse = ",")), " for(var i = 0; i < rows.length; ++i){", " if(index == rows[i]){", " $('td:eq(' + cols[i] + ')', row)", " .css({'background-color': colors[i]});", " }", " }", "}" ) }
示例用法
假设要给第1行第2列设为橙色,第3行第1列设为浅蓝色,第5行第3列设为浅绿色:
# 定义行列索引和对应颜色 target_rows <- c(1, 3, 5) target_cols <- c(2, 1, 3) cell_colors <- c("orange", "lightblue", "lightgreen") # 生成带自定义单元格颜色的表格 datatable(iris, options = list( dom = "t", rowCallback = JS(changeCellsColor(target_rows, target_cols, cell_colors)) ) )
关键说明
- R的行索引从1开始,而JS中表格行索引从0开始,因此函数里将
rows参数减1做格式转换 colors参数支持所有CSS合法颜色格式,比如颜色名称、十六进制值(如#FF5733)、RGB值等- 必须保证
rows、cols、colors三个向量的长度完全一致,否则会触发报错
内容的提问来源于stack exchange,提问作者nseq
相关产品推荐
相关产品推荐

