如何根据多个单元格的值为Datatable中的单元格着色?

时间:2020-04-10 17:54:14

标签: r shiny datatables dt

我有一个像下面这样的数据框,其中一列表示一个大的“组”,另一列表示该组中某人所在的“团队”,另外一列表示其在不同时间段的支出。

data <- data.frame("Team" = c("Alex", "Beth", "Andrew", "Bert"),
       "Group" = c("A","B","A","B"),
       "Spending_Q1" = c(1000, 500, 1500, 1000),
       "Spending_Q2" = c(500, 2000, 1000, 500))

使用DT包,我想根据Spending_Q1和Spending_Q2列各自的值(使用渐变:为更高的值使用较深的颜色)为列着色,但为每个团队使用不同的颜色。我已经能够完成大多数操作,对所有值应用相同的颜色渐变(例如蓝色阴影),但是不确定是否可以将阴影限制为特定的列。有人可以建议吗?

我已经咨询了RStudio guide to data table styling,但是它没有任何示例为特定的行和列指定阴影。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一种方法。渲染无法在RStudio中使用,但可以在浏览器中使用。

library(DT)

dat <- data.frame(
  "Team" = c("Alex", "Beth", "Andrew", "Bert"),
  "Group" = c("A","B","A","B"),
  "Spending_Q1" = c(1000, 500, 1500, 1000),
  "Spending_Q2" = c(500, 2000, 1000, 500),
  "Spending_Q3" = c(500, 1000, 1500, 1500)
)
columns <- c(3, 4, 5) # columns we want to colorize
nrows <- nrow(dat)

rowCallback <- c(
  "function(row, data, index){",
  sprintf("  var columns = [%s];", toString(columns)),
  "  var min = data[columns[0]];", 
  "  var max = data[columns[0]];",
  "  for(let i = 1; i < columns.length; i++){",
  "    min = Math.min(min, data[columns[i]]);",
  "    max = Math.max(max, data[columns[i]]);",
  "  }",
  sprintf("  var nrows = %d;", nrows),
  "  var h = index * 360/nrows;",
  "  for(let i = 0; i < columns.length; i++){",
  "    var j = columns[i];",
  "    var l = 75 - 50*(data[j]-min)/(max-min);",
  "    var color = 'hsl(' + h + ', 100%, ' + l + '%)';",
  "    $('td:eq(' + j + ')', row).css('background-color', color);",
  "  }",
  "}"
)

datatable(
  dat, 
  options = list(
    rowCallback = JS(rowCallback),
    columnDefs = list(
      list(className = "dt-center", targets = "_all")
    )
  )        
)

enter image description here