【问题标题】:How to format DT background *per row*?如何格式化DT背景*每行*?
【发布时间】:2019-10-23 21:23:10
【问题描述】:

我想使用 DT 的 formatStyle() 来提供每行的颜色渐变。

鉴于此示例数据:

library(DT)

data <- round(data.frame(
  x = runif(5, 0, 5),
  y = runif(5, 0, 10), 
  z = runif(5, 0, 20)
), 3)

break_points <- function(x) stats::quantile(x, probs = seq(.05, .95, .05), na.rm = TRUE)
red_shade <- function(x) round(seq(255, 40, length.out = length(x) + 1), 0) %>% {paste0("rgb(255,", ., ",", ., ")")}

我可以使用以下代码根据整个表格中的值为单元格背景着色:

brks <- break_points(data)
clrs <- red_shade(brks)
datatable(data) %>% formatStyle(names(data), backgroundColor = styleInterval(brks, clrs))

或者我可以使用以下代码根据每列的值为单元格背景着色:

brks <- apply(data, 2, break_points)
clrs <- apply(brks, 2, red_shade)
dt <- datatable(data)
for(i in colnames(data)){
  dt <- dt %>% formatStyle(i, backgroundColor = styleInterval(brks[,i], clrs[,i]))
}
dt

但我不确定每行最简单、最干净的解决方案是什么,因此在每一行中,最高值最暗,而最低值最亮。

【问题讨论】:

  • 不是你问的,Dean,但你看过gt吗?我知道它使用gt::data_color 提供每个单元格格式。
  • gt 还不够成熟,无法满足我的需求。它没有任何交互性,也不适合在闪亮的环境中使用(还没有!)
  • 交互性当然是我希望看到的添加到它的功能列表中的东西。同意,只是想我会提到它。 (希望我能为您解答 this 问题。)

标签: r dt


【解决方案1】:

使用 rowCallback:

library(DT)

data <- round(data.frame(
  x = runif(10, 0, 5),
  y = runif(10, 0, 10), 
  z = runif(10, 0, 20)
), 3)

break_points <- function(x) stats::quantile(x, probs = seq(.05, .95, .05), na.rm = TRUE)
red_shade <- function(x) round(seq(255, 40, length.out = length(x) + 1), 0) %>% {paste0("rgb(255,", ., ",", ., ")")}

brks <- apply(data, 1, break_points)
clrs <- apply(brks, 2, red_shade)

rowCallback <- "function(row, data, displayNum, index){"

for(i in 1:ncol(data)){
  rowCallback <- c(
    rowCallback,
    sprintf("var value = data[%d];", i)
  )
  for(j in 1:nrow(data)){
    rowCallback <- c(
      rowCallback, 
      sprintf("if(index === %d){", j-1),
      sprintf("$('td:eq(%d)',row).css('background-color', %s);", 
              i, styleInterval(brks[,j], clrs[,j])),
      "}"
    )
  }
}
rowCallback <- c(rowCallback, "}")

datatable(data, options = list(rowCallback = JS(rowCallback)))

【讨论】:

  • 感谢回复和编辑。正如您指出的那样,它看起来不正确。在第一行,6.124 应该比 18.101 轻得多,在第四行,4 应该比 19.5 更接近 3.64,等等。
  • @DeanAttali 我看到一个错误:for(i in 1:nrow(data)) 应该是 for(i in 1:ncol(data))。但我仍然不相信。
  • 等等,我想我明白了。
  • @DeanAttali 查看我的更新答案。我认为现在这是正确的。
  • ping (并随时删除您最后的评论回复)
猜你喜欢
  • 2010-10-08
  • 2018-08-25
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2018-07-31
  • 2019-03-31
相关资源
最近更新 更多