多列格式样式 DT R

9
我有一个包含一个ID列和多个数值列的数据框,数值列的数量可能不同。在这些数值列中,我想将所有大于列均值的值标记为绿色,并将所有小于列均值的值标记为红色。下面的代码可以实现我想要的结果,但它并不适用于具有更多或更少数值列的通用数据框。
library(DT)
    
data2 <- cbind(ID = "some ID",iris[,1:4])
        
datatable(
  data2, rownames = FALSE, class = 'cell-border stripe',
  options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All'))
  )
) %>%
  formatStyle(colnames(data)[2], backgroundColor = styleInterval(mean(data2[,2]), c("red","green"))) %>%
  formatStyle(colnames(data)[3], backgroundColor = styleInterval(mean(data2[,3]), c("red","green"))) %>%
  formatStyle(colnames(data)[4], backgroundColor = styleInterval(mean(data2[,4]), c("red","green"))) %>%
  formatStyle(colnames(data)[5], backgroundColor = styleInterval(mean(data2[,5]), c("red","green")))

我想用下面的代码替换上面的代码,但是不起作用。当数字列的数量发生变化时,下面的代码也可以工作。
datatable(
  data2, rownames = FALSE, class = 'cell-border stripe',
  options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All'))
  )
) %>%
  formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleInterval(colMeans(data2[,2:ncol(data2)]), c("red","green")))

这可能吗?如果是,怎么做?

1个回答

6
你可以通过加法计算来完成它,如下所示:

(在不同的列中使用相同值无效)

hepl_1=sapply(2:ncol(data2),function(i)  ifelse(data2[[i]]>=mean(data2[[i]]),"rgb(255,0,0)","rgb(0,255,0)"))
help_3=as.matrix(data2[2:ncol(data2)])

datatable(
  data2, rownames = FALSE, class = 'cell-border stripe',
  options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All'))
  )
) %>%
  formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleEqual(help_3, hepl_1))

更新

您可以生成rowCallback,例如:

datatable(
  data2, rownames = FALSE, class = 'cell-border stripe',
  options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')),
    rowCallback=JS(paste0("function(row, data) {\n",
                          paste(sapply(2:ncol(data2),function(i) paste0("var value=data[",i-1,"]; if (value!==null) $(this.api().cell(row,",i-1,").node()).css({'background-color':value <=", mean(data2[[i]])," ? 'red' : 'green'});\n")
                          ),collapse = "\n"),"}" ))
  )
) 

如果您在一个列中将值标为红色,在另一列中将其标为绿色,那么拥有数字矩阵和相应颜色矩阵的想法就行不通了。这时它会给出第一列的颜色。 - Berecht
确定颜色后,您可以抖动或随机化它。只需确保创建的随机数是唯一的即可。 - Berecht

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接