R Shiny颜色代码表行取决于单元格内容

时间:2017-06-01 13:03:44

标签: r shiny shinydashboard

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

enter image description here

基本上给你一个例子,代码需要依赖于第二列,所以如果它说撒哈拉以南非洲,那么整行都是一定的颜色,拉丁美洲和加勒比海也是如此颜色。 “区域”列右侧还有一些其他列。我想我可能需要在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"))

2 个答案:

答案 0 :(得分:3)

@GGamba有点快。但是,您可能感兴趣的是,如果使用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"))
    })
  }
)
}

答案 1 :(得分:0)

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