R闪亮的renderTable改变单元格颜色

时间:2018-06-11 13:31:20

标签: javascript css r html-table shiny

我有一张桌子,想要根据X(= 6)不同深浅蓝色的值(0-100)为每个单元格着色。该表显示在TabPanel中。

目前我正在使用shinyjs来调用一个javascript函数来选择我的表并将CSS样式添加到<td>标签,具体取决于值范围。

问题是,在第一次加载表格时(单击TabPanel),只有在重新加载后才显示颜色。

所以我要么在R中寻找解决方案(不需要额外的Javascript),要么自动重新加载Table / TabPanel。

library(shiny)

ui <- shinyUI(fluidPage(
    tableOutput("dataTable")
  ))

server <- shinyServer(function(input, output) {

  output$dataTable <- renderTable({
    data <- getDataFromSomeWhere();
    //Some operations on data
    data
    //I want to color every table cell, depening on value (f.e. 0-5 = white, 10-20 = light blue ...)
  }, rownames = TRUE, colnames = TRUE)

shinyApp(ui = ui, server = server) 

更新 最后我继续使用JavaScript解决方案,但使用闪亮的特定js事件来获得所需的效果:

$(document).on("shiny:value", function(e) {
  if (e.name == "myComponent") {
    e.preventDefault();
    $('#myComponent').html(e.value);
    //color code etc.
}

2 个答案:

答案 0 :(得分:2)

您可以使用tableHTML创建表格并有条件地设置它。

library(shiny)
library(tableHTML)

更改ui以使用tableHTML的输出函数:

ui <- shinyUI(fluidPage(
  tableHTML_output("dataTable")
))

然后使用render_tableHTML()呈现在其中生成的表。

您可以使用函数tableHTML()创建纯HTML表。然后,您可以使用add_css_conditional_column()创建条件(在本例中为between)来更改背景颜色(注意:您也可以使用其他css。我使用#f6f6f6代替{{ 1}}在示例中,因为您不会看到输出中的差异)

white

最终结果是:

server <- shinyServer(function(input, output) {

  getDataFromSomeWhere <- reactive({
    mtcars
  })

  output$dataTable <- render_tableHTML({
    data <- getDataFromSomeWhere();
    # //Some operations on data
    data %>% 
      tableHTML(rownames = TRUE) %>% 
      add_css_conditional_column(conditional = 'between',
                                 between = c(0, 5),
                                 css = list(c('background-color'),
                                            c('#f6f6f6')),
                                 columns = 1:ncol(data)) %>% 
      add_css_conditional_column(conditional = 'between',
                                 between = c(10, 20),
                                 css = list(c('background-color'),
                                            c('lightblue')),
                                 columns = 1:ncol(data))

  })

})

shiny_app_output

您可以在vignettes中找到有关如何使用shinyApp(ui = ui, server = server) 的更多详细信息。

答案 1 :(得分:1)

我认为最好的解决方案是使用DT库功能。 该表在美学上更令人愉悦,并且还保留了可滚动表的功能。两者都立即缺少tableHTML

服务器包含renderDataTable函数,用户可以在其中有条件地格式化表格:

server <- shinyServer(function(input, output) {
 output$beautifulTable <- DT::renderDataTable({
    
    # display top 5 rows at a time
    options(DT.options = list(pageLength = 5))
    
    # example dataframe
    df = as.data.frame(cbind(matrix(round(rnorm(50), 3), 10), sample(0:1, 10, TRUE)))
    
    # set conditions and return the beautiful table
    return(datatable(df) %>% formatStyle('V6', backgroundColor = styleEqual(c(0, 1), c('gray', 'yellow'))))
      
  })
}

UI只需调用dataTableOutput

ui <- shinyUI(fluidPage(
  # display the beautiful table
  dataTableOutput("beautifulTable")
))

显示结果:

shinyApp(ui = ui, server = server) 

您将获得: enter image description here 这里有更多示例:https://rstudio.github.io/DT/010-style.html