Shiny modules — moduleServer
v1.7.0|Source:
R/modules.R
Description
Shiny's module feature lets you break complicated UI and server logic into smaller, self-contained pieces. Compared to large monolithic Shiny apps, modules are easier to reuse and easier to reason about. See the article at https://shiny.posit.co/articles/modules.html to learn more.
Arguments
- id
An ID string that corresponds with the ID used to call the module's UI function.
- module
A Shiny module server function.
- session
Session from which to make a child scope (the default should almost always be used).
Value
The return value, if any, from executing the module server function
Details
Starting in Shiny 1.5.0, we recommend using moduleServer
instead of
callModule()
, because the syntax is a little easier
to understand, and modules created with moduleServer
can be tested with
testServer()
.
Examples
# Define the UI for a module
counterUI <- function(id, label = "Counter") {
ns <- NS(id)
tagList(
actionButton(ns("button"), label = label),
verbatimTextOutput(ns("out"))
)
}
# Define the server logic for a module
counterServer <- function(id) {
moduleServer(
id,
function(input, output, session) {
count <- reactiveVal(0)
observeEvent(input$button, {
count(count() + 1)
})
output$out <- renderText({
count()
})
count
}
)
}
# Use the module in an app
ui <- fluidPage(
counterUI("counter1", "Counter #1"),
counterUI("counter2", "Counter #2")
)
server <- function(input, output, session) {
counterServer("counter1")
counterServer("counter2")
}
if (interactive()) {
shinyApp(ui, server)
}
# If you want to pass extra parameters to the module's server logic, you can
# add them to your function. In this case `prefix` is text that will be
# printed before the count.
counterServer2 <- function(id, prefix = NULL) {
moduleServer(
id,
function(input, output, session) {
count <- reactiveVal(0)
observeEvent(input$button, {
count(count() + 1)
})
output$out <- renderText({
paste0(prefix, count())
})
count
}
)
}
ui <- fluidPage(
counterUI("counter", "Counter"),
)
server <- function(input, output, session) {
counterServer2("counter", "The current count is: ")
}
if (interactive()) {
shinyApp(ui, server)
}