R shiny 渲染表格如何更改单元格颜色

4

我有一个表格,希望根据X中的值(0-100)使用6种不同的蓝色来对每个单元格进行着色。该表格在TabPanel中显示。

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

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

因此,我要么寻找R语言中的解决方案(无需额外的Javascript),要么寻找自动重新加载表格/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解决方案,但是使用了Shiny特定的js事件来获得所需的效果:

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

3
您可以使用tableHTML创建表格并进行条件样式设置。
library(shiny)
library(tableHTML)

ui 更改为使用来自 tableHTML 的输出函数:

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

然后使用render_tableHTML()来渲染生成的表格。
您可以使用函数tableHTML()创建一个普通的HTML表格。然后,您可以使用add_css_conditional_column()创建条件(在本例中为between),以更改背景颜色(注意:您也可以使用其他CSS。在示例中,我使用了#f6f6f6代替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))

  })

})

最终结果为:
shinyApp(ui = ui, server = server) 

您可以在vignettes中找到有关如何使用tableHTML的更多详细信息。

shiny_app_output

注:tableHTML是一个与R语言相关的包,用于创建HTML表格。

感谢您的详细回复。我会仔细研究一下。由于我有很多表格(全部都是闪亮的tableOutput/renderTable),所以我宁愿不添加其他样式/库依赖。 - HectorLector

3
我认为最好的解决方案是使用 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) 

您将获得以下内容: 输入图像描述 更多示例请参见:https://rstudio.github.io/DT/010-style.html


我的设备可能有问题,但是在Shiny应用程序上没有显示任何内容,也没有表格。 - Wallace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接