I have a shiny application which uses nested modules. What I would like to do is call a shiny module ui in a grandparent's ui and the shiny server in the grandchild server. Here is a simple example:
library(shiny)
sub_module_b_ui <- function(id) {
ns <- NS(id)
sliderInput(
inputId = ns("slider"),
label = "my slider",
min = 1,
max = 100,
value = 20,
step = 1,
)
}
#' @export
sub_module_b_server <- function(id) {
moduleServer(id, function(input, output, session) {
observeEvent(input$slider, {
print(input$slider)
})
})
}
sub_module_a_server <- function(id, parent_ns) {
moduleServer(id, function(input, output, session) {
sub_module_b_server(id = "filters")
})
}
main_module_ui <- function(id) {
ns <- NS(id)
sub_module_b_ui(id = ns("filters"))
}
#' @export
main_module_server <- function(id) {
moduleServer(id, function(input, output, session) {
ns <- session$ns
sub_module_a_server(id = "sub_module_a", parent_ns = ns)
})
}
ui <- fluidPage(
tags$h1("My page"),
main_module_ui(id = "main_module")
)
server <- function(input, output) {
main_module_server(id = "main_module")
}
shinyApp(ui = ui, server = server)
To explain a bit further, this is the hierarchy:
- Shiny application
" --- main module"
" ---------- sub module a"
" ---------------- sub module b"
What I am really trying to achieve is call sub_module_b_ui inside of main_module_ui. And call sub_module_b_server inside of the sub_module_a_server. To me it does not seem related to namespaces because even when I manually type the input id:
sub_module_b_server <- function(id) {
moduleServer(id, function(input, output, session) {
observeEvent(input[["main_module-filters-slider"], {
print(input$slider)
})
})
}
the observe even does not trigger the event.
Would appreciate anyone's help.