Skip to contents

The Select component provides a dropdown menu for selecting one or more items from a list of options.

Select vs Autocomplete

While both Select() and Autocomplete() provide dropdown functionality, they serve different purposes:

Use Select() when: - You have a short, fixed list of options - Users need to see all options at a glance - No search/filtering is needed - You want a simpler, more compact interface

Use Autocomplete() when: - You have a data.frame with a long list of options - Search/filtering functionality is beneficial - Users might not know the exact option they want - You need grouped options with search - Multiple selection with tag display is important

Basic Usage

Use Select.shinyInput() to create a dropdown select with options provided as MenuItem() children.

library(shiny)
library(muiMaterial)

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "animal",
      value = "dog",
      sx = list(minWidth = 200),
      MenuItem(value = "dog", "Dog"),
      MenuItem(value = "cat", "Cat"),
      MenuItem(value = "fish", "Fish")
    ),
    verbatimTextOutput("selected")
  )
)

server <- function(input, output) {
  output$selected <- renderText({
    paste("Selected:", input$animal)
  })
}

shinyApp(ui, server)

Variants

Select supports three visual variants: outlined (default), filled, and standard.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Stack(
      spacing = 2,
      Select.shinyInput(
        inputId = "select_outlined",
        variant = "outlined",
        value = "dog",
        sx = list(minWidth = 200),
        MenuItem(value = "dog", "Dog"),
        MenuItem(value = "cat", "Cat"),
        MenuItem(value = "fish", "Fish")
      ),
      Select.shinyInput(
        inputId = "select_filled",
        variant = "filled",
        value = "dog",
        sx = list(minWidth = 200),
        MenuItem(value = "dog", "Dog"),
        MenuItem(value = "cat", "Cat"),
        MenuItem(value = "fish", "Fish")
      ),
      Select.shinyInput(
        inputId = "select_standard",
        variant = "standard",
        value = "dog",
        sx = list(minWidth = 200),
        MenuItem(value = "dog", "Dog"),
        MenuItem(value = "cat", "Cat"),
        MenuItem(value = "fish", "Fish")
      )
    )
  )
)

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

shinyApp(ui, server)

Labels

Use the inputProps argument with a label property to add a label to the Select.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "pet",
      value = "dog",
      inputProps = list(label = "Choose your pet"),
      sx = list(minWidth = 200),
      MenuItem(value = "dog", "Dog"),
      MenuItem(value = "cat", "Cat"),
      MenuItem(value = "fish", "Fish"),
      MenuItem(value = "bird", "Bird")
    ),
    verbatimTextOutput("pet_output")
  )
)

server <- function(input, output) {
  output$pet_output <- renderText({
    paste("You selected:", input$pet)
  })
}

shinyApp(ui, server)

Multiple Selection

Set multiple = TRUE to allow selecting multiple values. The selected value will be an array.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "animals",
      multiple = TRUE,
      value = list("dog", "cat"),
      inputProps = list(label = "Select multiple animals"),
      sx = list(minWidth = 300),
      MenuItem(value = "dog", "Dog"),
      MenuItem(value = "cat", "Cat"),
      MenuItem(value = "fish", "Fish"),
      MenuItem(value = "bird", "Bird"),
      MenuItem(value = "rabbit", "Rabbit")
    ),
    verbatimTextOutput("animals_output")
  )
)

server <- function(input, output) {
  output$animals_output <- renderText({
    paste("Selected:", paste(input$animals, collapse = ", "))
  })
}

shinyApp(ui, server)

Grouped Options

Use ListSubheader() and Divider() to organize options into groups.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "environment",
      value = "",
      displayEmpty = TRUE,
      inputProps = list('aria-label' = 'Select environment'),
      sx = list(minWidth = 300),
      ListSubheader("Production"),
      MenuItem(value = "prod_web", "Web Application"),
      MenuItem(value = "prod_mobile", "Mobile App"),
      MenuItem(value = "prod_api", "API Service"),
      ListSubheader("Development"),
      MenuItem(value = "dev_local", "Local Development"),
      MenuItem(value = "dev_staging", "Staging Environment"),
      Divider(sx = list(mx = -1)),
      MenuItem(value = "add_new", "Add New Environment")
    ),
    verbatimTextOutput("env_output")
  )
)

server <- function(input, output) {
  output$env_output <- renderText({
    paste("Selected environment:", input$environment)
  })
}

shinyApp(ui, server)

Rich Menu Items

Use ListItemText() to create menu items with primary and secondary text.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "project",
      value = "web_app",
      inputProps = list(label = "Select project"),
      sx = list(minWidth = 300),
      MenuItem(
        value = "web_app",
        ListItemText(
          primary = "Web Application",
          secondary = "React-based frontend"
        )
      ),
      MenuItem(
        value = "mobile_app",
        ListItemText(
          primary = "Mobile Application",
          secondary = "Cross-platform mobile app"
        )
      ),
      MenuItem(
        value = "backend_api",
        ListItemText(
          primary = "Backend API",
          secondary = "RESTful API service"
        )
      )
    ),
    verbatimTextOutput("project_output")
  )
)

server <- function(input, output) {
  output$project_output <- renderText({
    paste("Selected project:", input$project)
  })
}

shinyApp(ui, server)

Form Controls

Combine with FormControl, FormLabel, and FormHelperText for enhanced forms.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    FormControl(
      sx = list(minWidth = 300),
      FormLabel("Pet Selection"),
      Select.shinyInput(
        inputId = "pet_form",
        value = "dog",
        MenuItem(value = "dog", "Dog"),
        MenuItem(value = "cat", "Cat"),
        MenuItem(value = "fish", "Fish"),
        MenuItem(value = "bird", "Bird")
      ),
      FormHelperText("Choose your favorite pet from the list.")
    ),
    verbatimTextOutput("pet_form_output")
  )
)

server <- function(input, output) {
  output$pet_form_output <- renderText({
    paste("Your favorite pet:", input$pet_form)
  })
}

shinyApp(ui, server)

Display Empty

Use displayEmpty = TRUE to show a placeholder even when no value is selected.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "choice",
      value = "",
      displayEmpty = TRUE,
      inputProps = list(label = "Make a choice"),
      sx = list(minWidth = 200),
      MenuItem(value = "", em("None")),
      MenuItem(value = "option1", "Option 1"),
      MenuItem(value = "option2", "Option 2"),
      MenuItem(value = "option3", "Option 3")
    ),
    verbatimTextOutput("choice_output")
  )
)

server <- function(input, output) {
  output$choice_output <- renderText({
    if (input$choice == "") {
      "No selection made"
    } else {
      paste("Selected:", input$choice)
    }
  })
}

shinyApp(ui, server)

Auto Width

Set autoWidth = TRUE to automatically size the dropdown menu based on its content.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Stack(
      spacing = 2,
      Typography("Without autoWidth:", variant = "body2"),
      Select.shinyInput(
        inputId = "select1",
        value = "short",
        sx = list(minWidth = 200),
        MenuItem(value = "short", "Short"),
        MenuItem(value = "long", "Very Long Option Text Here")
      ),
      Typography("With autoWidth:", variant = "body2"),
      Select.shinyInput(
        inputId = "select2",
        value = "short",
        autoWidth = TRUE,
        MenuItem(value = "short", "Short"),
        MenuItem(value = "long", "Very Long Option Text Here")
      )
    )
  )
)

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

shinyApp(ui, server)

Styling

Use the sx argument for custom styling and control the appearance of the Select component.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "styled_select",
      value = "option1",
      inputProps = list(label = "Styled Select"),
      sx = list(
        minWidth = 250,
        backgroundColor = "primary.light",
        borderRadius = 2,
        "& .MuiOutlinedInput-notchedOutline" = list(
          borderColor = "primary.main",
          borderWidth = 2
        ),
        "&:hover .MuiOutlinedInput-notchedOutline" = list(
          borderColor = "primary.dark"
        )
      ),
      MenuItem(value = "option1", "Option 1"),
      MenuItem(value = "option2", "Option 2"),
      MenuItem(value = "option3", "Option 3")
    )
  )
)

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

shinyApp(ui, server)

Updating Select Values

Use updateSelect.shinyInput() to programmatically update the selected value from the server.

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "animal_update",
      value = "dog",
      inputProps = list(label = "Select animal"),
      sx = list(minWidth = 200),
      MenuItem(value = "dog", "Dog"),
      MenuItem(value = "cat", "Cat"),
      MenuItem(value = "fish", "Fish"),
      MenuItem(value = "bird", "Bird")
    ),
    Box(
      sx = list(mt = 2),
      Button.shinyInput(
        inputId = "reset_btn",
        "Reset to Dog"
      )
    ),
    verbatimTextOutput("animal_update_output")
  )
)

server <- function(input, output, session) {
  output$animal_update_output <- renderText({
    paste("Current selection:", input$animal_update)
  })
  
  observeEvent(input$reset_btn, {
    updateSelect.shinyInput(
      session = session,
      inputId = "animal_update",
      value = "dog"
    )
  })
}

shinyApp(ui, server)

Native Select

Set native = TRUE to use the browser’s native select element (useful for mobile devices).

ui <- muiMaterialPage(
  CssBaseline(),
  Box(
    sx = list(p = 2),
    Select.shinyInput(
      inputId = "native_select",
      native = TRUE,
      value = "dog",
      inputProps = list(label = "Native Select"),
      sx = list(minWidth = 200),
      tags$option(value = "dog", "Dog"),
      tags$option(value = "cat", "Cat"),
      tags$option(value = "fish", "Fish")
    ),
    verbatimTextOutput("native_output")
  )
)

server <- function(input, output) {
  output$native_output <- renderText({
    paste("Selected:", input$native_select)
  })
}

shinyApp(ui, server)

Note: When using native = TRUE, use HTML option() elements instead of MenuItem() components.