【问题标题】:formatStyle over multiple columns DT R多列 DT R 上的 formatStyle
【发布时间】:2016-10-29 05:25:14
【问题描述】:

我有一个包含一个 ID 列和多个数字列的 data.frame,数字列的数量可能不同。在这些数字列中,我想将列上方的所有值都着色为绿色,列下方的所有值都表示红色。下面的代码给出了我想要的结果,但它不是具有或多或少数字列的数据框的通用代码。

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(data[,2]), c("red","green"))) %>%
  formatStyle(colnames(data)[3], backgroundColor = styleInterval(mean(data[,3]), c("red","green"))) %>%
  formatStyle(colnames(data)[4], backgroundColor = styleInterval(mean(data[,4]), c("red","green"))) %>%
  formatStyle(colnames(data)[5], backgroundColor = styleInterval(mean(data[,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")))

这可能吗?所以是的,怎么做?

【问题讨论】:

    标签: r dt


    【解决方案1】:

    你可以用加法计算来做到这一点

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

    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))
    

    更新

    你可以生成rowCallbacklike

    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"),"}" ))
      )
    ) 
    

    【讨论】:

    • 如果你在不同的列中具有相同的值,当它在一列红色和另一列绿色时,拥有一个带有数字的矩阵和一个具有相应颜色的矩阵的想法是行不通的。然后它将给出第一列的颜色
    • 您可以在确定颜色后进行抖动或随机化。只有你需要确保创建的随机数是唯一的
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2019-07-28
    • 2019-04-12
    • 1970-01-01
    • 2016-01-02
    • 2019-10-20
    • 2021-05-20
    相关资源
    最近更新 更多