【问题标题】:Total of a column in DT dataTables in shiny闪亮的 DT 数据表中的一列总数
【发布时间】:2018-08-14 14:28:42
【问题描述】:

我正在尝试使用 DT::datatable 在我的闪亮应用程序中计算列的total。我的意思是表格中所有元素的总和,而不仅仅是当前分页中显示的内容。在此example 之后,以下代码应该可以工作(但不能):

jsCode <- "function(row, data, start, end, display) {

                  var api = this.api(), data;

                  total = api.column(1, {page: 'all'}).data().reduce( function(a, b) { return a + b}, 0); 

                  $( api.column(1).footer() ).html('Total: ' + total);
                  }"

我从中得到的只是当前分页中元素的总和。完整代码如下:

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;

                  total = api.column(1, {page: 'all'}).data().reduce( function(a, b) { return a + b}, 0); 

                  $( api.column(1).footer() ).html('Total: ' + total);
                  }"

# UI ---- 
ui <- function(){

  fluidPage(

    sidebarLayout(

      sidebarPanel(numericInput("nums", label = "Num Input", value = 1, min = 1, max = 10)),

      mainPanel(dataTableOutput("mytable"))

    )

  )

}

# server ----
server <- function(input, output, session){

  cont <- htmltools::withTags(table(
    tableHeader(names(company)),tableFooter(names(company))
  ))

  output$mytable <- DT::renderDataTable(  {

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

谢谢

【问题讨论】:

  • @PorkChop 不,不是。该线程帮助我做到了这一点,但它只给了我小计(或分页总数)。我需要列中所有元素的总数。感谢您回答其他线程顺便说一句...
  • 我标记为重复,因为问题是相同的,你应该撞另一个
  • 好的,那我该如何回答我的问题呢?我同意问题的性质相似,但第一个问题中的解决方案在这种特定情况下不起作用。
  • 这在 Shiny 之外工作,或者在 Shiny 内部工作,但有条件设置选项 server = FALSE。正如here 所说,在服务器端处理模式下使用 DataTables [...] 选择器只能选择当前页面上的那些行。.
  • 感谢您的参与。现在更有意义了

标签: r shiny datatables-1.10 dt


【解决方案1】:

也许您可以编写一个解决方法:如下所示:

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

【讨论】:

  • 谢谢。你知道为什么 `.colum(x, {page: 'all'}' 不起作用吗?
  • 我确实尝试了这一行与页脚回调提供的行,但它不起作用。 datatables.net/examples/advanced_init/footer_callback.html 很奇怪。我怀疑缺少一些依赖项。我做了“hacks”,比如在不分页和计算的情况下显示整个表格,只显示 500px,但这不是一个好的解决方案
  • 顺便说一句,我试图让 .column(x).data() 工作但没有成功
  • PorkChop,请参阅我在 OP 下方的评论。这就解释了为什么colum(x, {page: 'all'}) 不起作用。这是由于服务器模式处理造成的。
猜你喜欢
  • 2018-02-01
  • 2021-05-05
  • 2018-10-04
  • 2016-08-18
  • 2017-09-30
  • 2021-01-02
  • 2016-10-25
  • 2020-09-18
  • 2019-05-05
相关资源
最近更新 更多