Button extension to download all data or only visible data

As @divibisan said, one option is to use the server argument of renderDT() to control whether the download button will download only the current or all rows.

That would work well if you want to have one download button. However if you want to have two buttons always appear, where one download the current page and one downloads the full dataset, you can use the following code:

library(shiny)

ui <- fluidPage(
  DT::DTOutput("table")
)

server <- function(input, output, session) {
  output$table <- DT::renderDT(server = FALSE, {
    DT::datatable(
      mtcars,
      extensions = c("Buttons"),
      options = list(
        dom = 'Bfrtip',
        buttons = list(
          list(extend = "csv", text = "Download Current Page", filename = "page",
               exportOptions = list(
                 modifier = list(page = "current")
               )
          ),
          list(extend = "csv", text = "Download Full Results", filename = "data",
               exportOptions = list(
                 modifier = list(page = "all")
               )
          )
        )
      )
    )
  })
}

shinyApp(ui, server)

See this answer: Buttons: download button with scroller downloads only few rows

Whether the buttons export all data or only visible data is determined by the server argument in the DT::renderDT function call. If server=FALSE then the buttons will export all data in the table, while if server=TRUE they will only export visible data.

You could set the server argument with a variable to make this a selectable option.

output$table <- DT::renderDT(server = input$download_all, {
    DT::datatable( ... )
}

The other option you might want to look at is the exportOptions: modifier: selected option that determines whether to download only selected rows (the default) or all rows. You can read about that option here: https://datatables.net/extensions/buttons/examples/print/select.html

Note that your users might run into performance and memory issues using server=FALSE if your data table is very large.

Tags:

R

Dt

Shiny