Andrew Scotchmer
Andrew Scotchmer

Reputation: 313

Populate selectizeInput on first load

Below is some code for a very simple shiny dashboard. On tab 1 "Select" I have a radio button selector and on tab 2 "Food" I have a selectizeInput.

When the dashboard initially loads the first tab is loaded and "Fruits" is selected by default. When I move to tab 2 however, nothing displays in the selectizeInput drop down menu dispite having an observe event linked to the radio buttons.

If I then go back to the Select tab and click on Meats, the selectizeInput populates. If I then select Fruits again on the Select tab, the selectizeInput populates with a list of fruits.

How do I make the selectizeInput populate on first load with the list of fruits?

Thanks

library(shinydashboard)
library(data.table)

menu <- data.table(numb = c(rep(1,4), rep(2,4)),
               item = c("Apple", "Orange", "Grape", "Lemon", "Steak", "Chicken", "Pork", "Venison"))


ui <- dashboardPage(skin = "blue",
                    dashboardHeader(),
                    dashboardSidebar(
                      sidebarMenu(id = "initalTab",
                                  sidebarMenuOutput("menuSidebar"))
                      ),
                    dashboardBody(
                        tabItems(
                          tabItem("select",
                                  uiOutput("selectType")),
                          tabItem("food",
                                  uiOutput("selectFood"))
                          )
                    )
)

server <- (function(input, output, session) {

  output$menuSidebar <- renderMenu({
    sidebarMenu(
      menuItem("Select", tabName = "select", icon = icon("home")),
      menuItem("Food", tabName = "food", icon = icon("sort"))
    )
  })

  isolate({updateTabItems(session, "initalTab", "select")})

  output$selectType <- renderUI({
    fluidRow(
      box(width = 3, status = "primary", solidHeader = TRUE,
          radioButtons("foodFilter", label = h4("Filter by Food Type"),
                       choices = c("Fruits" = 1, "Meats" = 2),
                       selected = 1,
                       inline = TRUE)
      )
    )
  })

  output$selectFood <- renderUI({
    fluidRow(
      box(width = 6, status = "primary", solidHeader = TRUE,
      h4("Select Your Food"),
      selectizeInput("group",
                     choices = NULL,
                     width ="100%",
                     NULL,
                     NULL,
                     multiple = TRUE,
                     options = list(plugins = list("drag_drop", "remove_button"),
                                    placeholder = "Please select you food"))
      )
    )
  })

  observeEvent(input$foodFilter, {
    updateSelectizeInput(session,
                     "group",
                     choices = menu[numb == input$foodFilter,`item`],
                     selected = menu[numb == input$foodFilter,`item`][1],
                     server = TRUE)
  })
})


shinyApp(ui, server)

Upvotes: 1

Views: 116

Answers (1)

Pork Chop
Pork Chop

Reputation: 29417

Building up on my comment try adding this line outputOptions(output, "selectFood", suspendWhenHidden = FALSE)

library(shinydashboard)
library(data.table)
library(shiny)

menu <- data.table(numb = c(rep(1,4), rep(2,4)),
                   item = c("Apple", "Orange", "Grape", "Lemon", "Steak", "Chicken", "Pork", "Venison"))


ui <- dashboardPage(skin = "blue",
                    dashboardHeader(),
                    dashboardSidebar(
                      sidebarMenu(id = "initalTab",
                                  sidebarMenuOutput("menuSidebar"))
                    ),
                    dashboardBody(
                      tabItems(
                        tabItem("select",
                                uiOutput("selectType")),
                        tabItem("food",
                                uiOutput("selectFood"))
                      )
                    )
)

server <- (function(input, output, session) {

  output$menuSidebar <- renderMenu({
    sidebarMenu(
      menuItem("Select", tabName = "select", icon = icon("home")),
      menuItem("Food", tabName = "food", icon = icon("sort"))
    )
  })

  isolate({updateTabItems(session, "initalTab", "select")})

  output$selectType <- renderUI({
    fluidRow(
      box(width = 3, status = "primary", solidHeader = TRUE,
          radioButtons("foodFilter", label = h4("Filter by Food Type"),
                       choices = c("Fruits" = 1, "Meats" = 2),
                       selected = 1,
                       inline = TRUE)
      )
    )
  })

  output$selectFood <- renderUI({
    fluidRow(
      box(width = 6, status = "primary", solidHeader = TRUE,
          h4("Select Your Food"),
          selectizeInput("group",
                         choices = NULL,
                         width ="100%",
                         NULL,
                         NULL,
                         multiple = TRUE,
                         options = list(plugins = list("drag_drop", "remove_button"),
                                        placeholder = "Please select you food"))
      )
    )
  })

  outputOptions(output, "selectFood", suspendWhenHidden = FALSE)  

  observeEvent(input$foodFilter,{
    updateSelectizeInput(session,
                         "group",
                         choices = menu[numb == input$foodFilter,`item`],
                         selected = menu[numb == input$foodFilter,`item`][1],
                         server = TRUE)
  })
})


shinyApp(ui, server)

Upvotes: 1

Related Questions