如何按列分位数设置Shiny DataTable单元格样式?
问题需求
我需要为Shiny DataTable的单元格按列设置6个分位数对应的样式(第一列为字符型,不参与样式设置)。目前我能实现根据列均值将单元格分为两种样式,但想改成按列计算分位数来分配不同背景色。另外,用户可以选择/取消选择列,所以解决方案需要适配当前数据集的所有列。我不熟悉JavaScript。
现有最小可复现示例(MRE)
library(shiny) library(DT) set.seed(123) dataset <- data.frame( ID = 1:20, Value1 = round(rnorm(10, mean = 15, sd = 5), 1), Value2 = round(rnorm(10, mean = 25, sd = 8), 1)) ui <- fluidPage( titlePanel("Reprex for cell styling"), dataTableOutput("myTable")) server <- function(input, output, session) { output$myTable <- renderDataTable({ datatable( dataset, options = list( rowCallback = JS(paste0( "function(row, data) {\n", paste( sapply( 2:ncol(dataset), function(i) paste0("var value=data[", i, "]; if (value!==null) $(this.api().cell(row,", i,").node()).css({'background-color':value <= ", mean(dataset[[i]]), " ? '#6EACCA' : '#FFDD91'});\n") ), collapse = "\n" ), "}\n" )) ) ) }) } shinyApp(ui, server)
我的尝试及问题
我尝试了以下代码,但效果不符合预期:
rowCallback = JS(paste0("function(row, data) {\n", " // Iterate over columns starting from the second column (index 1)\n", sapply(2:ncol(dataset), function(i) { paste0( " var value = data[", i, "];\n", " if (value !== null) {\n", " // Calculate column-level quantiles for the current column\n", " var columnData = data.map(function(row) { return row[", i, "]; });\n", " var quantiles = quantile(columnData, [0, 0.2, 0.4, 0.6, 0.8, 1]);\n", " var color;\n", " if (value <= quantiles[1]) color = '#BFD3E6';\n", " else if (value <= quantiles[2]) color = '#8BACD6';\n", " else if (value <= quantiles[3]) color = '#6382C1';\n", " else if (value <= quantiles[4]) color = '#385FAD';\n", " else if (value <= quantiles[5]) color = '#0D3D99';\n", " else color = ''; // Handle edge cases if needed\n", " $(this.api().cell(row, ", i, ").node()).css({'background-color': color});\n", " }\n" ) }), "}\n"))
最接近成功的一次实现了6个分位数的样式,但临界值变成了整个数据表的数值,而非列级分位数。
内容的提问来源于stack exchange,提问作者sraby
相关产品推荐
相关产品推荐

