Skip to content

Instantly share code, notes, and snippets.

@Vestaxis
Last active March 31, 2016 15:20
Show Gist options
  • Save Vestaxis/79abf2df98c9b543e729 to your computer and use it in GitHub Desktop.
Save Vestaxis/79abf2df98c9b543e729 to your computer and use it in GitHub Desktop.
Dynamic UI where UI of one module is injected into another module.
library(shiny)
filtersUI <- function(id) {
ns <- NS(id)
fluidRow(
uiOutput(ns("filters"))
)
}
filters <- function(input, output, session, tabselected, subfilters) {
output$filters <- renderUI({
req(tabselected())
subfilters[[tabselected()]]
})
}
subfilter1UI <- function(id) {
ns <- NS(id)
fluidRow(
textOutput(ns("filter"))
)
}
subfilter1UI2 <- function(id) {
ns <- NS(id)
tagList(
uiOutput(ns("select1")),
uiOutput(ns("select2"))
)
}
subfilter1 <- function(input, output, session) {
ns <- session$ns
model <- reactive({
req(!is.null(input$select1))
unique(mpg$model[mpg$class == input$select1])
})
output$select1 <- renderUI({
selectizeInput(ns("select1"), "Class", choices = unique(mpg$class))
})
output$select2 <- renderUI({
selectizeInput(ns("select2"), "Model", choices = model())
})
output$filter <- renderText(input$select2)
invisible()
}
subfilter2UI <- function(id) {
ns <- NS(id)
fluidRow(
textOutput(ns("filter"))
)
}
subfilter2UI2 <- function(id) {
ns <- NS(id)
tagList(
uiOutput(ns("select1")),
uiOutput(ns("select2"))
)
}
subfilter2 <- function(input, output, session) {
ns <- session$ns
model <- reactive({
req(!is.null(input$select1))
unique(mpg$model[mpg$manufacturer == input$select1])
})
output$select1 <- renderUI({
selectizeInput(ns("select1"), "Manufacturer", choices = unique(mpg$manufacturer))
})
output$select2 <- renderUI({
selectizeInput(ns("select2"), "Model", choices = model())
})
output$filter <- renderText(input$select2)
invisible()
}
ui <- fixedPage(
wellPanel(
subfilter1UI("subfilter1")
),
wellPanel(
subfilter2UI("subfilter2")
),
wellPanel(
filtersUI("filters")
),
wellPanel(
selectInput("tabselected", "Select:", c("first" = "first", "second" = "second"))
)
)
server <- function(input, output, session) {
tabselected = reactive(input$tabselected)
callModule(subfilter1, "subfilter1")
callModule(subfilter2, "subfilter2")
callModule(filters, "filters", tabselected, subfilters = list("first" = subfilter1UI2("subfilter1"),
"second" = subfilter2UI2("subfilter2")))
}
shinyApp(ui, server)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment