2016-07-20 12 views
6

Obsługuję tabele z więcej niż 100 000 wierszy i korzystam z pakietu DT (wersja rozwojowa 0.1.56), aby wizualizować go w aplikacji Shiny.Przyciski DT: przycisk pobierania z przewijaniem pobiera tylko kilka wierszy

Ponadto używam rozszerzeń DT jako: Buttons, aby pobrać dane w różnych formatach. Jednak gdy rozszerzenie Scroller jest również aktywowane, jestem w stanie pobrać tylko kilka wierszy (nie wszystkie dane).

Przykładowy kod:

library("shiny") 
library("DT") 

shinyApp(
    ui = fluidPage(DT::dataTableOutput('tbl')), 
    server = function(input, output) { 
    output$tbl = DT::renderDataTable(
     iris,extensions=c("Buttons",'Scroller'),options = list(dom = 'Bfrtip', 
               buttons = c('copy', 'csv', 'excel', 'pdf', 'print'),scrollY = 50, 
               scroller = TRUE 
    )) 
    } 
) 

Dodatkowo jeśli biegnę tylko tę część kodu w badania i uzyskać DataTable w przeglądarce, jestem w stanie skopiować wszystkie wiersze itd., Jak to jest w ogóle możliwe?

library("DT") 
datatable(
    iris, 
    extensions = 'Buttons', options = list(
    dom = 'Bfrtip', 
    buttons = c('copy', 'csv', 'excel', 'pdf', 'print') 
) 
) 

próbowałem różne podejścia:

  1. Zmiana scrollY = ... na liście opcji -> to działa, ale liczba scrollY musi być ogromny faktycznie wyświetlić wszystkie wiersze danych tak można go pobrać w całości -> nie jest to dobre podejście, ponieważ moje dane pochodzą z bazy danych, uzyskuję różną liczbę wierszy oraz powoduje, że aplikacja wyjątkowo wolno

  2. Korzystanie z opcji pageLength: pageLength = ..., lengthMenu=c(..,..,..,..)

jednak możliwość wyboru nie jest wyświetlany na wszystkich ...

Jakieś pomysły jak mogę rozwiązać ten problem?

  • Jestem świadomy odownloadHandler() podejścia, jednak wolałbym to zrobić poprzezDT jako dostępne Rozszerzenia dać piękny i elegancki sposób, który pozwala na pobieranie danych w różnych formatach jednocześnie, takich jak pdf , Excel, CSV i drukuj.

** Widziałem już to samo pytanie:

Download button downloads only 145 rows in DataTables with Scroller

ale nie zostało odebrane w rozumieniu DT pakietu

z góry dzięki

+3

Co stanie się, jeśli dodasz 'server = FALSE' w' DT :: renderDataTable'? – Carl

+0

Cześć Carl, w rzeczywistości działa idealnie! Dzięki! Jeśli opublikujesz to jako odpowiedź, zaakceptuję to od razu –

Odpowiedz

7

Kwestia jest to, że gdy tylko dane są wyświetlane, wysyłane są do klienta. Ustawienie server=FALSE powoduje renderowanie wszystkich elementów DT w kliencie, aby wszystkie dane tam były.

2

To jest rzeczywiście server = TRUE, który robi lewę.

Oto kod, ponieważ niektórzy ludzie tacy jak ja mogą umieścić argument w niewłaściwym miejscu.

library("shiny") 
library("DT") 

shinyApp(
    ui = fluidPage(DT::dataTableOutput('tbl')), 
    server = function(input, output) { 
    output$tbl = DT::renderDataTable(server = FALSE,{ 
     DT::datatable(iris, 
        extensions=c("Buttons",'Scroller'), 
        options = list(dom = 'Bfrtip', 
            buttons = c('copy', 'csv', 
               'excel', 'pdf', 
               'print'), 
            scrollY = 50, 
            scroller = TRUE) 
    ) 
    }) 
    } 
) 
Powiązane problemy