【问题标题】:Single/multiple conditions for columns formating with DT使用 DT 格式化列的单个/多个条件
【发布时间】:2019-01-06 18:09:44
【问题描述】:

这与Is there any similar approach to conditional formating for multiple columns from excel in Shiny 中的问题有关,提供的解决方案工作正常,但我在如何扩展代码以满足新要求方面有点堆栈。因此,如果我有以下数据框并想根据以下条件更改五列的背景颜色:

  • 对于 X、Y 列
  • 如果 -4
  • elseif Y >10 X,Y 的颜色为蓝色
  • 否则 X ="" 或 Y="" 则 X,Y 的颜色为白色

  • 对于 A、B、C 列

  • 如果“A”
  • 如果“B”
  • 如果 "C"

我尝试在这里扩展提供的解决方案,但没有奏效。任何人都可以帮助如何解决这个问题。

output$contents <- renderDataTable({
    df <- data.frame(
      id = 1:10, 
      X = c(-2, 4, 40, -0.1228, 2.9, 9, 2.7, 2.7, 31, -30),
      Y = c(-18.9, -19.5, 19.6, 12, 11.1, 73, 4.3, 39, 2.5, 1.6),
      A = c(-7.3, 5.1 ,0.12, 15, 21, 1.2, -0,07, 4.3, 39, 2.5) 
      B = c(-18.9, 0.12, 15, 11.1, 73, -2, 4, 40, -19.5, 19.6)
      C = c(4.3, 39, 2.5, 1.6, -7.3, 6, 5.1 ,0.12, -0.07, 4.3)
    library(DT)
    datatable(df) %>% formatStyle(
      'A',
      target = 'cell',
      backgroundColor = styleInterval(3, c('green','pink')))
    %>% formatStyle(
      'B',
      target = 'cell',
      backgroundColor = styleInterval(3, c('green','pink'))
    )%>% formatStyle(
      'C',
      target = 'cell',
      backgroundColor = styleInterval(3, c('green','pink'))
    )

    colors <- with(df, ifelse(X > -4 & X < 4 & Y < 10, 
                              "pink", 
                              ifelse(Y > 10, 
                                     "blue", "white")))

    rgbcolors <- apply(grDevices::col2rgb(colors), 2, 
                       function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=",")))
    columns <- c(2,3) # columns X and Y
    jscode <- 
      paste("function(row, data, index) {",  
            sprintf("var colors=%s;\n%s", 
                    sprintf("[%s]", 
                            paste(sprintf("'%s'", rgbcolors), collapse=", ")), 
                    paste(sprintf("$(this.api().cell(index, %s).node()).css('background-color', colors[index]);", 
                                  columns), collapse="\n")), 
            "}", sep="\n")
    datatable(df, escape=FALSE, 
              options = list(rowCallback=JS(jscode))
    )
    jscode <- "function(row, data, index) {
  var colors = ['rgb(255,192,203)', 'rgb(255,255,255)', 'rgb(0,0,255)', 'rgb(0,0,255)', 'rgb(0,0,255)', 'rgb(0,0,255)', 'rgb(255,192,203)', 'rgb(0,0,255)', 'rgb(255,255,255)', 'rgb(255,255,255)'];
  $(this.api().cell(index, 2).node()).css('background-color', colors[index]);
  $(this.api().cell(index, 3).node()).css('background-color', colors[index]);
}"

提前谢谢你

【问题讨论】:

    标签: javascript r shiny dt


    【解决方案1】:

    开始
    datatable(df, escape=FALSE, 
                  options = list(rowCallback=JS(jscode)))
    

    并添加formatStyle

    library(DT)
    df <- data.frame(
      id = 1:10, 
      X = c(-2, 4, 40, -0.1228, 2.9, 9, 2.7, 2.7, 31, -30),
      Y = c(-18.9, -19.5, 19.6, 12, 11.1, 73, 4.3, 39, 2.5, 1.6),
      A = c(-7.3, 5.1 ,0.12, 15, 21, 1.2, -0,07, 4.3, 39),
      B = c(-18.9, 0.12, 15, 11.1, 73, -2, 4, 40, -19.5, 19.6),
      C = c(4.3, 39, 2.5, 1.6, -7.3, 6, 5.1 ,0.12, -0.07, 4.3)
    )
    
    colors <- with(df, ifelse(X > -4 & X < 4 & Y < 10, 
                              "pink", 
                              ifelse(Y > 10, 
                                     "blue", "white")))
    rgbcolors <- apply(grDevices::col2rgb(colors), 2, 
                       function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=",")))
    columns <- c(2,3) # columns X and Y
    jscode <- 
      paste("function(row, data, index) {",  
            sprintf("var colors=%s;\n%s", 
                    sprintf("[%s]", 
                            paste(sprintf("'%s'", rgbcolors), collapse=", ")), 
                    paste(sprintf("$(this.api().cell(index, %s).node()).css('background-color', colors[index]);", 
                                  columns), collapse="\n")), 
            "}", sep="\n")
    
    datatable(df, escape=FALSE, 
              options = list(rowCallback=JS(jscode))) %>% 
      formatStyle(
        'A',
        target = 'cell',
        backgroundColor = styleInterval(3, c('green','pink'))) %>% 
      formatStyle(
        'B',
        target = 'cell',
        backgroundColor = styleInterval(3, c('green','pink'))) %>% 
      formatStyle(
        'C',
        target = 'cell',
        backgroundColor = styleInterval(3, c('green','pink'))
      )
    

    【讨论】:

    • 非常感谢 Stephane,它非常有效。如果您能解释一下这部分代码的全部内容,我将不胜感激:rgbcolors &lt;- apply(grDevices::col2rgb(colors), 2, function(rgb) sprintf("rgb(%s)", paste(rgb, collapse=","))) columns &lt;- c(2,3) # columns X and Y jscode &lt;- paste("function(row, data, index) {", sprintf("var colors=%s;\n%s", sprintf("[%s]", paste(sprintf("'%s'", rgbcolors), collapse=", ")), paste(sprintf("$(this.api().cell(index, %s).node()).css('background-color', colors[index]);", columns), collapse="\n"))
    • @Alexis_543 此代码创建了一些 Javascript 代码。输入cat(jscode) 以查看结果。
    【解决方案2】:

    我提供的第一个解决方案工作正常,但代码不可读。这是一个更清洁的解决方案。

    library(DT)
    df <- data.frame(
      id = 1:10, 
      X = c(-2, 4, 40, -0.1228, 2.9, 9, 2.7, 2.7, 31, -30),
      Y = c(-18.9, -19.5, 19.6, 12, 11.1, 73, 4.3, 39, 2.5, 1.6),
      A = c(-7.3, 5.1 ,0.12, 15, 21, 1.2, -0,07, 4.3, 39),
      B = c(-18.9, 0.12, 15, 11.1, 73, -2, 4, 40, -19.5, 19.6),
      C = c(4.3, 39, 2.5, 1.6, -7.3, 6, 5.1 ,0.12, -0.07, 4.3)
    )
    jscode <- "function(settings) {
      var table = settings.oInstance.api();
      var nrows = table.rows().count();
      for(var i=0; i<nrows; i++){
        var cell1 = table.cell(i,2);
        var cell2 = table.cell(i,3);
        var X = cell1.data(); var Y = cell2.data();
        var bgcolor = 'white';
        if(X > -4 && X < 4 && Y < 10){
          bgcolor = 'pink';
        }else if(Y > 10){
          bgcolor = 'blue';
        }
        cell1.node().style.backgroundColor = bgcolor;
        cell2.node().style.backgroundColor = bgcolor;
      }
    }"
    datatable(df, escape=FALSE, 
              options = list(initComplete=JS(jscode))) %>% 
      formatStyle(
        'A',
        target = 'cell',
        backgroundColor = styleInterval(3, c('green','pink'))) %>% 
      formatStyle(
        'B',
        target = 'cell',
        backgroundColor = styleInterval(3, c('green','pink'))) %>% 
      formatStyle(
        'C',
        target = 'cell',
        backgroundColor = styleInterval(3, c('green','pink'))
      )
    

    【讨论】:

      猜你喜欢
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2019-03-06
      • 2019-12-17
      • 1970-01-01
      • 2019-04-12
      相关资源
      最近更新 更多