在 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 中将总计/小计添加到数据表的底部的主要内容,如果未能解决你的问题,请参考以下文章