I have two R Shiny example files that use sidebarPanel()
and mainPanel()
. One file, shown below, is called “Main App”, and the other, also shown below, is called “Mod1”. I would like to make the Mod1 a namespace module used by Main App to add to its respective sidebarPanel()
and its mainPanel()
. I would like to do this while maintaining the sidebarPanel()
and mainPanel()
of Mod1 so I can test and build that module separately from the Main App. Note for sake of simplicity the 2 examples are drafted where there is no data sharing between them although that will come later if I can figure out this first step.
Is this possible, and if so, how can this be done? Again, where the UI of Mod1 is embedded in the UI of Main App.
I figure I could build the module without sidebarPanel()
and mainPanel()
, using tagList()
instead, but I need to be able to separately run and test the Mod1 module.
Here is Main App:
ui <- fluidPage(
sidebarPanel(
h4(strong("Main App")),
h5(strong("Sidebar panel shell:"))
),
mainPanel(
h4(strong("Main App")),
h5(strong(textOutput("sendMssg1")))
)
)
server <- function(input, output, session) {
output$sendMssg1 <- renderText("Main panel shell:")
}
shinyApp(ui, server)
Here is Mod1:
ui <- fluidPage(
sidebarPanel(
h4(strong("Mod1")),
h5(strong("Base value:")),
sliderInput("svc", "", min = 0, max = 10, value = 0)
),
mainPanel(
h4(strong("Mod1")),
textOutput("sendMssg2"),
br(),
textOutput("result1")
)
)
server <- function(input, output, session) {
output$sendMssg2 <- renderText(paste("You input the base value of: ",input$svc))
output$result1 <- renderText({
paste("Mod 1 Result = base + 10:", input$svc + 10)
})
}
shinyApp(ui, server)
This example shows how I usually structure my modules, where there is data sharing:
library(shiny)
mod1_ui <- function(id) {
ns <- NS(id)
textOutput(ns("result1"))
}
mod1_server <- function(input, output, session, common) {
output$result1 <- renderText({
common$mod1Value <- common$sharedValue + 10
paste("Mod 1 Result = base + 10:", common$mod1Value)
})
}
ui <- fluidPage(
sidebarPanel(
h5(strong("Base value:")),
sliderInput("svc", "", min = 0, max = 10, value = 0)
),
mainPanel(
textOutput("sendMssg"),
br(),
mod1_ui("mod1")
)
)
server <- function(input, output, session) {
output$sendMssg <- renderText(paste("You input the base value of: ",input$svc))
common <- reactiveValues(sharedValue = 0)
observeEvent(input$svc, { common$sharedValue <- input$svc })
callModule(mod1_server, "mod1", common = common)
}
shinyApp(ui, server)
Using my MS Paint skills, the merged UI would look like this: