Using the downloadableTable Shiny Module

Dr. Connie Brett




This Shiny Module was created in order to provide a consistent-looking and easy-to-use table including a downloadFileButton that is automatically created, linked and managed.



Shiny Module Overview

Shiny modules consist of a pair of functions that modularize, or package, a small piece of reusable functionality. The UI function is called directly by the user to place the UI in the correct location (as with other shiny UI objects). The server function is not called directly by the user of the module. Instead the module server function is called only once to set it up using the shiny::callModule function inside the server function (i.e. user-local session scope. The callModule function supplies the first three arguments of the Shiny Module’s function inputs - the input, output, and session. Additional arguments supplied by the user in the callModule function are passed to the specific shiny module that is called. There can be additional helper functions that are a part of a shiny module.

The downloadableTable Shiny Module is a part of the periscope package and consists of the following functions:


The downloadableTableUI function is called from the ui.R (or equivalent) file in the location where the table should be placed. This is similar to other UI element placement in shiny.

The downloadableTableUI looks like:

The downloadableTableUI function takes the unique object ID for the UI object. The next two arguments (downloadtypes and hovertext) are passed to the downloadFileButton and set the file types the button will allow the user to request and the downloadFileButton’s tooltip text. The contentHeight argument is optional but important - it sets the viewable height of the table content which can be any css-recognizable size value.

downloadableTables are multi-select by default, however if you need a table to only allow single row selections you can set the singleSelect argument to TRUE.

# Inside ui_body.R or ui_sidebar.R

                    downloadtypes = c("csv", "tsv"), 
                    hovertext = "Download the data here!",
                    contentHeight = "300px",
                    singleSelect = FALSE)


The downloadableTable function is not called directly - instead a call to shiny::callModule is made inside the server.R (or equivalent) file to initialize the module.

The call consists of the following:

Data Function Requirements

Reactive Return Value

The callModule function returns a reactive expression containing the selected rows (data, not references, rownumbers, etc - the actual table row data). This allows the user to capture this to update another table, chart, etc. as desired. It is acceptable to ignore the return value as well if this functionality is not needed.

# Inside server_local.R

selectedrows <- callModule(downloadableTable, 
                           logger = ss_userAction.Log,
                           filenameroot = "mydownload1",
                           downloaddatafxns = list(csv = mydatafxn1, tsv = mydatafxn2),
                           tabledata = mydatafxn3,
                           rownames = FALSE,
                           caption = "This is a great table!  By: Me" )

# selectedrows is the reactive return value, captured for later use

Sample Application

For a complete running shiny example application using the downloadableTable module you can create and run a periscope sample application using:


app_dir = tempdir()
create_new_application('mysampleapp', location = app_dir, sampleapp = TRUE)
runApp('mysampleapp', appDir = app_dir)

Additional Resources