Total of a column in DT dataTables in shiny

前端 未结 1 1115
闹比i
闹比i 2020-12-18 01:13

I am trying to calculate the total of a column in my shiny app using DT::datatable. By total I mean the sum of all elements in a table not

相关标签:
1条回答
  • 2020-12-18 02:02

    Maybe you can write a workaround: such as below:

    library(shiny)
    library(DT)
    
    set.seed(2282018)
    company <- data.frame(Company = letters[1:30], Units = round(runif(30,  1000, 10e6), 0), Price = scales::dollar(runif(30, 200, 1230)), stringsAsFactors = F)
    jsCode <- "function(row, data, start, end, display) {var api = this.api(), data;$( api.column(1).footer() ).html('Total: ' + MYTOTAL);}"
    
    # Workaround
    getTotal <- function(data,index){
    
      if(index < 1 || index > ncol(data)){
        return("")
      }
      col <- data[,index]
      col <- gsub("[$]","",col)
      col <- gsub("[£]","",col)
      col <- gsub("[,]","",col)
      col <- suppressWarnings(as.numeric(col))
      if(all(is.na(col))){
        return("")
      }
      sum(col)
    }
    
    
    ui <- function(){
      fluidPage(
        sidebarLayout(
          sidebarPanel(numericInput("nums", label = "Num Input", value = 1, min = 1, max = 10)),
          mainPanel(dataTableOutput("mytable"))
        )
      )
    }
    
    server <- function(input, output, session){
    
      Total <- reactive({
        getTotal(company,2)
      })
    
      cont <- htmltools::withTags(table(
        tableHeader(names(company)),tableFooter(names(company))
      ))
    
      output$mytable <- DT::renderDataTable(  {
        jsCode <- sub("MYTOTAL",Total(),jsCode)
        DT::datatable(company,
                      container = cont,
                      caption = tags$caption("Example"), 
                      filter = "none", 
                      rownames = F,
                      options = list(autoWidth = T, 
                                     pageLength = 10, 
                                     scrollCollapse = T,
                                     dom = 'lftp', 
                                     footerCallback = JS(jsCode))
        )
      }
      )
    }
    
    runApp(list(ui = ui, server = server))
    

    0 讨论(0)
提交回复
热议问题