Add download buttons in DT::renderDataTable
Asked Answered
C

3

30

I am trying to add download buttons ('copy', 'csv', 'excel', 'pdf') above the table in my R Shiny app, but the renderDataTable seems doesn't work when using a datatable inside.

output$mytable1  <- DT::renderDataTable(
        datatable(
            { plots.dfs()[[1]] },
        rownames = TRUE,
        options = list(
            fixedColumns = TRUE,
            autoWidth = TRUE,
            ordering = FALSE,
            dom = 'tB',
            buttons = c('copy', 'csv', 'excel', 'pdf')
        ),
        class = "display"
    ))

When I use DT::renderDataTable without DT::datatable inside, renderDataTable works well and I have all features (filters, search field, etc), except download buttons (what I am trying to add)

output$mytable1 = DT::renderDataTable({ plots.dfs()[[1]] })

Do you have any idea of what I am doing wrong? Thanks for your help

Crust answered 26/4, 2018 at 9:14 Comment(8)
where is the extensions = 'Buttons' command in your datatable()?Soak
Thanks, buttons now appear, but all renderDataTable features have dissapeared (column filter, search box, row selection, pagination, etc)... Do you have any idea on how to make them re-appear?Crust
check that table hope your features are in a green box.Soak
I am using Firefox Quantum 59.0.2 (64 bits). When I use only renderDataTable everything works fine (but of course, buttons are not there) output$mytable1 = DT::renderDataTable({ plots.dfs()[[1]] })Crust
so without the extensions argument, all features are working?Soak
No. When I use datatable() inside renderDataTable(), the only feature that work is buttons. All other features have dissapeared (column filter, search box, row selection, pagination, etc)Crust
@Soak : As the first question (add a download button) has been answered, I have created a new question for pagination and search box : #50043652Crust
Somehow dom = 'Bfrtip' makes all options appear as the post below suggested. Not sure what it means.Thickleaf
C
35

As Stephan said in comment, the way to add buttons is the following:

output$mytable1  <- DT::renderDataTable(
                        DT::datatable(
                            { plots.dfs()[[1]] },

                            extensions = 'Buttons',

                            options = list(
                                paging = TRUE,
                                searching = TRUE,
                                fixedColumns = TRUE,
                                autoWidth = TRUE,
                                ordering = TRUE,
                                dom = 'tB',
                                buttons = c('copy', 'csv', 'excel')
                            ),

                            class = "display"
                       ))
Crust answered 26/4, 2018 at 10:23 Comment(2)
Thanks, that works just fine, but is there an option to download all data (inside other pagings) instead of 'only' the data shown?Turboprop
The method has been to add server = FALSE to renderDataTable to allow it to fetch the whole table instead of just the part displayed, but now there are also functions in Shiny to add download buttons. See here, here, and here for more about this.Swig
E
16

Adding one more solution to keep search and paging (dom = 'Bfrtip'):

datatable(data, extensions = "Buttons", 
            options = list(paging = TRUE,
                           scrollX=TRUE, 
                           searching = TRUE,
                           ordering = TRUE,
                           dom = 'Bfrtip',
                           buttons = c('copy', 'csv', 'excel', 'pdf'),
                           pageLength=5, 
                           lengthMenu=c(3,5,10) ))
Etymology answered 7/7, 2021 at 20:56 Comment(2)
I tried this. Everything is fine but the lengthMenu is not shown.Thickleaf
Changing it to Blfrtip ('l' refers to lengthmenu) will work.Thickleaf
E
7

Adding an answer that is more explicit about allowing to download the whole table since it should be more clearly outlined in my opinion. Using renderDT({}) the download buttons only download the data currently being displayed. You can make the buttons download the entire dataset with renderDT(server = FALSE, {}) as used below:

renderDT(server=FALSE,{
  # Load data
  data <- mtcars
  # Show data
  datatable(data, extensions = 'Buttons', 
            options = list(scrollX=TRUE, lengthMenu = c(5,10,15),
                           paging = TRUE, searching = TRUE,
                           fixedColumns = TRUE, autoWidth = TRUE,
                           ordering = TRUE, dom = 'tB',
                           buttons = c('copy', 'csv', 'excel','pdf')))
})
Etymology answered 21/2, 2021 at 17:5 Comment(2)
This approach disables the search bar and page filtering due to dom='tB'. Do you know of a way to recover this using this approach?Orvieto
sending the whole table to the browser can cause it to freeze in case of very large tablesGratt

© 2022 - 2024 — McMap. All rights reserved.