Shift

2014-12-25 17 views
8

'daki bir DataTable'ın altına Toplam/Ara toplam ekleme DataTable olarak görüntülenen, aşağıda oluşturulan veri çerçevesinin altına Toplam/Ara toplamı ekleyebilmek istiyorum. Total/Subtotal uygulamasının, uygulanan her DataTable filtresiyle güncellenmesini isterim. Kullanıcı ilk 10 kaydı filtrelerse, toplamın ilk 10 kaydın toplamını hesaplamasını isterim veya kullanıcı 20 kaydı filtrelerse toplamın 20 kayıt toplamını yansıtmasını isterim.Shift

R numaralı belgede bunu elde etmenin bir yolunu, istenen hesaplamayı gerçekleştirmek için mevcut veri çerçevesine yeni bir satır bağlayarak düşündüm. Ama ben bunu DataTables seçenekleri ile elde etmek için kolay bir yol olup olmadığını merak ediyordum. this example'a benzer bir özellik, Altbilgi Geri Arama Aracı özelliğini kullanır.

Ayrıca, benzer sorulara yardımcı olmak için lütfen here ve here'u tıklatın.

#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

kötü durum sadece R JS kodu kopyalayıp olduğu; Bölüm 2.5.2'ye bakın: http://rstudio.github.io/DT/ –

+0

Doğru. hatta inandığım "I()" işlevi de aynı şeyi yapar. ama toplamı hesaplamak için özellikle kullanmam gereken sözdizimini biliyor musunuz? JavaScript dili bilgim çok sınırlıdır. –

+0

Yeni DT paketi için, JavaScript kodunu kaydırmak için I() yerine JS() kullanırsınız. –

cevap

1

Aşağıda, verilen sayfanın SubTotal'ının nasıl yapılacağı örnek verilmiştir. Toplamı elde etmek için önceden hesaplayabilir ve belki de paste'u JS çıktısına alabilirsin?

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

Sen dedin: Toplamı elde etmek için önceden hesaplayabilir ve sonra belki de JS çıkışına yapıştırabilirsin *. Bir 'arama 'seçeneği olduğunda, bununla nasıl başa çıkılır? Çok döngü olmaz mıydı? – Marta

+0

@PorkChop: bunu gönderdiğiniz için teşekkürler. Cevabını bastım çünkü işe yarıyor. Ancak, alt toplam, geçerli sayfa çıktısına dayanır. Sütun toplamını nasıl görüntüleyeceğinizi biliyor musunuz? Ben api.column (4, {page: 'all'}). '... js bölümünde denedim ama işe yaramadı. Herhangi bir fikir? – JdM

İlgili konular