How to make related server-side UI elements in R Shiny application?

I have R Shiny application with two UI selectors where each one has a big list of items. I know how to make server-side element for one element. But how to make two related server-side 'selectInput' elements. So, when exist a change in one element - another should reflect appropriately.

Example.

  1. The first list has 97,310 elements.
  2. The second list should have:

2.1. for 1st element "Aaban" - 2 related values (10, 11)

2.2. for 2nd element "Aabha" - 1 related value (12)

2.3. for 3rd element "Aabid" - 3 related values (13, 14, 15)

Here is R code.

library(shiny)
library(dplyr)
library(babynames)

# 1. Data sets

# 1.1. First data set (list)
list_names <- babynames::babynames %>% 
  distinct(name) %>%
  pull(name) %>%
  sort()

# 1.2. Second data set (data frame) for 3 first 'names' elements
df_ages <- data.frame(
  name = c("Aaban", "Aaban", "Aabha", "Aabid", "Aabid", "Aabid"),
  age  = c(10, 11, 12, 13, 14, 15))

# 2. UI
ui <- fluidPage(
  fluidRow(selectInput("si_name", "Name", multiple = FALSE, choices = character(0))),
  fluidRow(selectInput("si_age", "Age", multiple = FALSE, choices = character(0))))

# 3. Server
server <- function(input, output, session) {
  updateSelectizeInput(session, "si_name", choices = list_names, server = TRUE)
  updateSelectizeInput(session, "si_age", choices = df_ages$age, server = TRUE)
}

# 4. App
shinyApp(ui, server)

Hi,

you could link your name select input to another select input as follows. Below, you select a letter in the first input that reduces the number of choices in the second select input. This is just an example:

library(shiny)
library(dplyr)
library(babynames)


# 1. UI
ui <- fluidPage(
    selectInput("firstLetter", "Choose", choices = LETTERS, selected = "A"),
    uiOutput("serverSelect")
)

# 2. Server
server <- function(input, output, session) {
  
  list_names <- reactive({
    babynames::babynames %>% 
      distinct(name) %>%
      filter(stringr::str_detect(name, input$firstLetter)) %>%
      pull(name) %>%
      sort() 
  })
  
  output$serverSelect <- renderUI({
    selectInput("si_name", "Name", multiple = FALSE, choices = list_names())
  })
}

# 3. App
shinyApp(ui, server)

The best way is to generate your input via the renderUI function on the server side.

1 Like

Thanks for the answer. Yes, it works for "client-side" selectize input. The "server-side" based on "updateSelectizeInput". Please, welcome on https://stackoverflow.com/questions/56432553/how-to-make-related-server-side-selectize-ui-elements-in-r-shiny-application - There is an answer on this question now for "server-side" case. Thanks for your help!!!