【问题标题】:R Shiny colour code table row depending on cell contentsR 闪亮的颜色代码表行取决于单元格内容
【发布时间】:2017-06-01 13:03:43
【问题描述】:

我正在尝试根据第 2 列中的数据对表格的每一行进行颜色编码。请参见下图。

基本上给你一个例子,代码需要依赖于第二列,所以如果它说撒哈拉以南非洲,例如,使整行具有某种颜色,拉丁美洲和加勒比地区相同,但不同颜色。 Region 列的右侧还有一些其他列。我想我可能需要下面的 dataTable 函数中的一些 if 语句,但我们将不胜感激。

  output$Composite <- renderDataTable(datatable(FVI_DATA_COMPOSITE, 
                                                options = list(
                                                columnDefs = list(list(className = 'dt-center', targets = 3:9)))) 
                                                %>% formatRound(c(3:9), 2))

编辑:当前不工作的新代码块。

 output$Composite <- renderDataTable(datatable(FVI_DATA_COMPOSITE, 
                                                options = list(
                                                columnDefs = list(list(className = 'dt-center', targets = 3:9)), pageLength = 50, lengthChange = FALSE))  
                                                %>% formatRound(c(3:9), 2))
                                                %>% formatStyle(0, target = "row", 
                                                backgroundColor = styleEqual(which(FVI_DATA_COMPOSITE$Region == "Sub-Saharan Africa")[1], "red"))

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    如果使用设置target = "row"参数,也可以不使用JS格式化整行:

    library(shiny)
    library(magrittr)
    library(DT)
    shinyApp(
      ui = fluidPage(
        fluidRow(
          column(12,
                 dataTableOutput('table')
          )
        )
      ),
      server = function(input, output) {
        output$table <- renderDataTable({
          datatable(iris) %>% 
            formatStyle(0, target = "row", backgroundColor = styleEqual(which(iris$Sepal.Length < 5)[1], "red"))
        })
      }
    )
    }
    

    【讨论】:

    • 谢谢,这将如何适合我的代码示例?
    • 您可以从中了解到,您应该始终提供完整的应用程序和您正在使用的数据集。或任何其他可重现的示例,...您必须将 styleEqual() 函数的第一个值替换为数据中的条件,...或与我们共享示例数据。
    • 我无法分享确切的数据,但让我添加我正在尝试使用您的建议的代码块。查看已编辑的问题
    • 我看到你是相当新的,所以欢迎来到 SO。请考虑仔细阅读这篇文章:stackoverflow.com/questions/5963269/…。回答笼统的问题才是让更多人受益,调试个别代码sn-ps没用,...
    • 是的,感谢您的帮助。我会阅读你的建议。事实上,我确实让我的代码最终可以工作
    【解决方案2】:

    使用DT helper function 可以轻松地有条件地格式化单个单元格:

    library(DT)
    datatable(mtcars) %>% 
        formatStyle(0,
                    backgroundColor = styleEqual(c('Mazda RX4', 'Mazda RX4 Wag'), 
                                                 c('green', 'red')
                    )
        )
    

    有条件地格式化一整行,另一方面,我们必须在rowCallback选项中使用一些JS。

    类似的东西:

    library(DT)
    datatable(FVI_DATA_COMPOSITE,
              options = list(
                  rowCallback = JS('function(nRow, aData) {    
                                    if (aData[1] == "Sub-Saharan Africa")
                                      $(nRow).css("background-color", "#9BF59B");
                                    if (aData[1] == "Latin America ")
                                      $(nRow).css("background-color", "#yellow");
                                    }'),
                  columnDefs = list(list(className = 'dt-center', targets = 3:9))
              )
    ) %>% 
        formatRound(c(3:9), 2))
    

    【讨论】:

    • 谢谢,该代码可以按原样使用,还是我需要更改任何内容。我也试着把它放进去,但是当我试图打开桌子时,它只是挂着说正在处理。此外,第一列是国家,第二列是我们检查应用颜色的区域是否重要。索引应该是 2 而不是 1?
    • 关于您的第一部分:如果您还没有看到,您可以使用 target = "row" 来表示行(参见上面的另一篇文章),...
    • 我确实看到并赞成 :) 不想更新或删除我的答案,它可能在极端情况下会有所帮助(不确定是哪个,但是..)
    猜你喜欢
    • 2016-01-15
    • 2018-11-20
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多