You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按列分位数设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:25:21