如何加粗最后一行反应表达?

时间:2018-04-09 14:40:17

标签: r shiny shinydashboard dt

问题:

我无法找到一种方法来对反应式表达式table()进行子集化,以便仅为最后一行加粗。

对于背景,这是反应式表达式:

 table <- reactive({
  filtered <- service[service$test == input$testcenter,]
  filtered[5, (3:8)] <- colSums(filtered[,3:8])
  filtered$expression[5] <- "Net Total"
  filtered

})

如果我执行以下操作,我会将整个表格加粗。

output$service_table <- DT::renderDataTable(

 if(input$plot.options == "Dollar Amount") {
 table() %>%

 DT::datatable(
      options = list(
           dom = 't',
           digits = 0,
           rownames = FALSE
      )
 ) %>%
 DT::formatCurrency(
      columns = cols,
      currency = "$",
      digits = 0
 ) %>%
 DT::formatRound(
      columns = cols,
      digits = 0
 ) %>%
 DT::formatStyle(
      columns = cols,
      color = DT::styleInterval(0, c('red', 'green'))
 ) %>%
 DT::formatStyle(
      columns = 'metric',#table()$metric,
      valueColumns = 'metric',
      target = 'row',
      fontWeight = 'bold')
})

我想做的是将最后一行加粗。我尝试了以下所有方法: https://www.r-bloggers.com/dt-an-r-interface-to-the-datatables-library/ https://github.com/rstudio/DT/issues/183 How to mark last row in results of DataTable using R

没有成功。任何关于如何正确地对反应性表达进行子集的见解都将非常受欢迎。

1 个答案:

答案 0 :(得分:2)

你可以使用普通的CSS:

tbody > tr:last-child { 
  font-weight: bold; 
}

将tbody中最后一个tr元素的font-weight设置为粗体。

library(DT)
library(htmltools)
if (interactive()) {
  library(shiny)
  library(DT)
  shinyApp(
    ui = fluidPage(tags$head(tags$style(HTML("tbody > tr:last-child { 
                                               font-weight: bold; 
                                             }"))), fluidRow(column(12, DTOutput('tbl')))),
    server = function(input, output) {
      output$tbl = renderDT(
        iris, options = list(lengthChange = FALSE)
      )
    }
  )
}

enter image description here

如果您只希望数据的最后一行加粗,那么您可以使用一些JavaScript。在这里,我们对行号150进行硬编码,但您显然可以使用nrow(iris)来查找相应的单元格和行。

library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(tags$head(tags$style(HTML("tr>td:contains(150)+tr:last-child { 
                                             font-weight: bold; 
}"))), fluidRow(column(12, DTOutput('tbl')))),
  server = function(input, output) {

    jss <- 'function(setting, json) { 
      $("body").on("DOMNodeInserted", "tr", function() {
        if( $(this).find("td").html() == "150") $(this).css("font-weight", "bold");
      });
    }'

    output$tbl = renderDT(iris, options = list(lengthChange = FALSE, 
                                               initComplete = JS(jss)))
  }
)