在 Shiny 中将总计/小计添加到数据表的底部

Posted

技术标签:

【中文标题】在 Shiny 中将总计/小计添加到数据表的底部【英文标题】:Adding Total/Subtotal to the bottom of a DataTable in Shiny 【发布时间】:2015-02-23 09:42:08 【问题描述】:

我希望能够在下面创建的数据框底部添加总计/小计,显示为 DataTable。我希望使用应用的每个 DataTable 过滤器来更新总计/小计。假设如果用户过滤前 10 条记录,我希望总数计算前 10 条记录的总和,或者如果用户过滤 20 条记录,我希望总数反映 20 条记录的总和等等。

我已经想到了一种在 R 中实现这一点的方法,方法是将新行绑定到现有数据框以执行所需的计算。但我想知道是否有一种简单的方法可以通过 DataTables 选项实现这一点。类似于 this example 使用 页脚回调 功能。

另外,请点击here 和here 帮助解决类似问题。

 #Load required packages

require(shiny)

#Create a dataframe
df <- data.frame(random=1:25)

server <- function(input,output,session)

    #Display df using DataTable and apply desired options
    output$display <- renderDataTable(df)


ui <- shinyUI(fluidPage(

    #Add a title
    h1('Testing TableTools'),

        mainPanel(
           #Display results
           dataTableOutput('display')
                 )      


))

shinyApp(ui = ui, server = server)

【问题讨论】:

最坏的情况是你只是将JS代码复制到R;请参阅第 2.5.2 节:rstudio.github.io/DT 正确。甚至我相信I() 函数也会做同样的事情。但是你知道我应该使用什么语法来计算总数吗?我对 javascript 语言的了解非常有限。 对于新的 DT 包,您将使用 JS() 而不是 I() 来包装 JavaScript 代码。 你解决过这个问题吗?即使使用 rbind,也需要解决一些反应式编程问题才能实现这一点。 很遗憾没有。因为它不是一个关键功能,所以我决定放弃它。所以看起来它从那以后就没有得到解决? 【参考方案1】:

这是一个如何对给定页面进行小计的示例。要获得总数,您可以预先计算它,然后将 paste 输入到 JS 输出中?

library(shiny)
library(DT)

ui <- shinyUI(fluidPage(
  h1('Testing TableTools'),
  mainPanel(
    dataTableOutput('display')
  )      
))

Names <- c("",names(mtcars))
FooterNames <- c(rep("",4),Names[5:6],rep("",6))

server <- function(input, output, session) 

  sketch <- htmltools::withTags(table(
    tableHeader(Names),tableFooter(FooterNames)
  ))

  opts <- list(
    dom = 'Bfrtip', buttons = list('colvis','print',list(extend='collection',text='Download',buttons = list('copy','csv','excel','pdf'))),
               footerCallback = JS(
                 "function( tfoot, data, start, end, display ) ",
                 "var api = this.api(), data;",
                 "$( api.column(5).footer()).html('SubTotal:  '+",
                 "api.column(5).data().reduce( function ( a, b ) ",
                 "return a + b;",
                 " )",
                 ");",
                 "$( api.column(4).footer()).html('SubTotal: '+",
                 "api.column(4).data().reduce( function ( a, b ) ",
                 "return a + b;",
                 " )",
                 ");","")
  )

  output$display <- DT::renderDataTable(container = sketch,extensions = 'Buttons',options = opts,
    mtcars
  )


shinyApp(ui = ui, server = server)

【讨论】:

您说要获得总数,您可以预先计算它,然后将其粘贴到 JS 输出中。当有search 选项时如何处理?不会太循环了吧? @PorkChop:感谢您发布此信息。我赞成您的回答,因为它有效。但是,小计基于当前页面输出。你知道如何显示列总数吗?我在 js 部分尝试了api.column(4, page: 'all')....,但没有成功。有什么想法吗? 我感到很沮丧......它不起作用......它应该是一个超级简单的任务。 @MarcoFumagalli 你可以看到@JdM 的评论,它也适用于他。检查您使用的 DT 版本,我在 0.4.16 谢谢,周一早上去看看..我可能跳过了一些最近的更新

以上是关于在 Shiny 中将总计/小计添加到数据表的底部的主要内容,如果未能解决你的问题,请参考以下文章

计算所有项目总计到小计 Jquery

表 Javascript 中的小计和总计数

oracle中如何添加小计和总计

结帐 magento 1.5 中的小计和总计加倍

sql添加小计和总计

VBA添加具有可变范围的小计