Courvoisier
Courvoisier

Reputation: 983

R large datatable display in Shiny

I am trying to display a relatively large DataTable in a shiny app. The table's dimensions are 7000x30. The performance in Chrome was very very sluggish so I added the 'Scroller' extension to limit the rendering but that did not help. It seems that it is the large number of columns that is causing the issue, not the large number of rows. I also tried to used the colvis extension but the button gives a non scrollable list and with 30 columns, that wouldn't work. Also I tried to have some columns hidden using the visible option, but that didn't work.

Here is the example:

data = as_tibble(matrix(runif(200000), ncol=30))
data %>%
  DT::datatable(filter = 'top', extensions = c('Buttons', 'Scroller'), 
                options = list(scrollY = 650,
                               scrollX = 500,
                               deferRender = TRUE,
                               scroller = TRUE,
                               # paging = TRUE,
                               # pageLength = 25,
                               buttons = list('excel',
                                              list(extend = 'colvis', targets = 0, visible = FALSE)),
                               dom = 'lBfrtip',
                               fixedColumns = TRUE), 
                rownames = FALSE)

Weirdly, the Rstudio viewer shows the datatable and is fine. It's only when I Run the document as a shiny document and open it in Chrome that it becomes very sluggish. My questions are:

  1. Why is this happening
  2. How do I only show a limited number of columns by default and have the option to show the others
  3. is there a better button for colvis? if the list of columns exceeds the page length, I can't access those hidden columns to toggle them on or off.

Upvotes: 4

Views: 6380

Answers (1)

Kevin
Kevin

Reputation: 2044

What do you mean by sluggish?

I ran it and everything looks okay to me in terms of speed.

library(shiny)
library(shinydashboard)
library(DT)


####/UI/####
header <- dashboardHeader()

sidebar <- dashboardSidebar()

body <- dashboardBody(
  DT::dataTableOutput("test")
)

ui <- dashboardPage(header, sidebar, body)

####/SERVER/####
server <- function(input, output, session) {

  data <- as_tibble(matrix(runif(200000), ncol=30))

  output$test <- DT::renderDataTable({

    DT::datatable(
      data,
      filter = 'top', extensions = c('Buttons', 'Scroller'),
      options = list(scrollY = 650,
                     scrollX = 500,
                     deferRender = TRUE,
                     scroller = TRUE,
                     # paging = TRUE,
                     # pageLength = 25,
                     buttons = list('excel',
                                    list(extend = 'colvis', targets = 0, visible = FALSE)),
                     dom = 'lBfrtip',
                     fixedColumns = TRUE), 
      rownames = FALSE)
  })  

}

shinyApp(ui, server)

You may want to remove 'scroller' from Options = () as with that many rows, you may want to break it up into pages. Also, you can try to make the table server processing by putting Server = TRUE in there, that will make it process every page versus the whole dataset at once.

Upvotes: 2

Related Questions