2014-12-25 3 views
8

Vorrei poter aggiungere un totale/totale parziale nella parte inferiore del dataframe creato di seguito, visualizzato come DataTable. Vorrei che Total/Subtotal venisse aggiornato con ogni filtro DataTable applicato. Diciamo che se l'utente filtra i primi 10 record, vorrei che il totale calcolasse la somma dei primi 10 record o se l'utente filtra 20 record, vorrei che il totale riflettesse la somma dei 20 record e così via.Aggiunta totale/totale parziale alla parte inferiore di un DataTable in lucido

Ho pensato a un modo per ottenere ciò in R vincolando una nuova riga al dataframe esistente per eseguire il calcolo desiderato. Ma mi stavo chiedendo se c'è un modo semplice per raggiungere questo attraverso le opzioni DataTables. Qualcosa di simile a this example utilizzando la funzione Footer Callback.

Inoltre, fare clic su here e here per dare una mano con domande simili.

#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) 
+0

Il caso peggiore è basta copiare il codice JS per R; vedere la Sezione 2.5.2: http://rstudio.github.io/DT/ –

+0

corretta. o anche la funzione 'I()' credo che faccia la stessa cosa. ma sapresti quale sintassi dovrei usare in particolare per calcolare il totale? La mia conoscenza del linguaggio JavaScript è molto limitata. –

+0

Per il nuovo pacchetto DT, si utilizzerà JS() anziché I() per avvolgere il codice JavaScript. –

risposta

1

Ecco un esempio di come eseguire il SubTotal della pagina specificata. Per ottenere il totale è possibile pre-calcolare e quindi forse paste nell'output 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) 

enter image description here

+0

Hai detto * Per ottenere il totale, puoi pre-calcolare e poi magari incollarlo nell'output JS *. Come gestirlo, quando esiste un'opzione 'search'? Non sarebbe troppo perso? – Marta

+0

@PorkChop: grazie per aver postato questo. Ho upvoted la tua risposta perché funziona. Tuttavia, il subtotale si basa sull'output della pagina corrente. Sai come visualizzare la colonna totale? Ho provato 'api.column (4, {page: 'all'}).' ... nella porzione js ma non ha funzionato. Qualche idea? – JdM