Modularizing Shiny Apps with Editable DT Datatables: A Deep Dive
In this article, we’ll explore how to combine an editable DT datatable with a modular app structure and app-to-toplevel communication. We’ll break down the code, discuss the technical aspects, and provide examples to help you understand the concepts.
Introduction
Shiny is a popular R package for building web applications. When building complex apps, it’s essential to consider modularity, maintainability, and scalability. In this article, we’ll explore how to create a modular app structure that integrates an editable DT datatable with top-level communication.
Modularizing Shiny Apps
A modular approach involves breaking down the app into smaller components, each responsible for a specific functionality. This makes it easier to develop, test, and maintain individual modules without affecting the entire app.
In our example, we’ll create two main modules: datatableUI and datatableServer. The first module will handle the UI-related tasks, while the second module will focus on the server-side logic.
DatatableUI Module
The datatableUI module is responsible for rendering the DT datatable in the user interface. This module takes an ID as an argument and returns a list of HTML elements.
datatableUI <- function(id = "datatable") {
# Render the sidebar panel with the UI output
shiny::tagList(
shiny::sidebarPanel(
shiny::uiOutput("LocalTextPlaceholder")))
}
DatatableServer Module
The datatableServer module is responsible for rendering the DT datatable on the server-side. This module takes an ID as an argument and returns a Shiny module.
datatableServer <- function(id = "datatable") {
# Define the Shiny module
shiny::moduleServer(id, function(input, output, session) {
# Render the DT datatable
session$userData$DT <- DT::renderDataTable(
iris, selection = 'none', editable = TRUE,
rownames = TRUE,
extensions = 'Buttons',
options = list(
paging = TRUE,
searching = TRUE,
fixedColumns = TRUE,
autoWidth = TRUE,
ordering = TRUE,
dom = 'Bfrtip',
buttons = c('csv', 'excel')
),
class = "display")
# Observe the DT cell edit event
observeEvent(
session$userData$DTinput,
{
output$LocalTextPlaceholder <- shiny::renderUI(
shiny::markdown('<span style="color:red"> **Data was edited**</span>'))
session$userData$Text <- shiny::markdown('<span style="color:red"> **Data was edited**</span>')
}
)
})
}
App Structure
Now that we have our two modules, let’s create the app structure. We’ll use a fluid page with a sidebar layout and a main panel.
ui <- shiny::fluidPage(
# Title panel
shiny::titlePanel("Module Version"),
# Sidebar layout
shiny::sidebarLayout(
shiny::sidebarPanel(
# UI output for the LocalTextPlaceholder
shiny::uiOutput("TextPlaceholder")),
# Main panel with the datatable UI and DT placeholder
shiny::mainPanel(
datatableUI(),
shiny::uiOutput("DTPlaceholder"))
)
)
Server Function
The server function will connect our modules to the Shiny app.
server <- function(input, output, session) {
# Connect the LocalTextPlaceholder UI output to the DT input event
session$userData$DTinput <- shiny::reactive(input$DTPlaceholder_cell_edit)
# Run the datatableServer module
datatableServer()
# Observe the DT event and update the DT placeholder
observeEvent(
session$userData$DT,
{
output$DTPlaceholder <- shiny::renderUI(session$userData$DT)
}
)
# Update the TextPlaceholder UI output when the DT input changes
observeEvent(
session$userData$Text, ignoreInit = TRUE,
{
output$TextPlaceholder <- shiny::renderUI(session$userData$Text)
}
)
}
Conclusion
In this article, we’ve explored how to combine an editable DT datatable with a modular app structure and app-to-toplevel communication. We’ve broken down the code into smaller modules, discussed the technical aspects, and provided examples to help you understand the concepts.
By following these steps, you can create a modular Shiny app that integrates an editable DT datatable with top-level communication. This approach will make it easier to develop, test, and maintain individual modules without affecting the entire app.
Additional Resources
- Shiny documentation: https://shiny.r-project.org/
- DT documentation: http://datatables.net
- RStudio Shiny tutorials: https://rstudio.com/tutorials/shiny
Last modified on 2024-08-27