In Shiny, I want to be able to choose All when I use selectInput.
However, in the shiny app below, when I used selectInput for column Species and specified the option All for choices, shiny converted the column to number (instead of factor).
library(shiny)
library(palmerpenguins)
# Load the palmerpenguins dataset
data("penguins")
# Define UI
ui <- fluidPage(
titlePanel("Penguin Species Selector"),
sidebarLayout(
sidebarPanel(
selectInput("species", "Select Species:",
choices = c("All", unique(penguins$species))),
hr(),
helpText("Select a species to view its data.")
),
mainPanel(
tableOutput("penguin_table")
)
)
)
# Define server logic
server <- function(input, output) {
output$penguin_table <- renderTable({
if (input$species == "All") {
return(penguins)
} else {
return(subset(penguins, species == input$species))
}
})
}
# Run the application
shinyApp(ui = ui, server = server)
When I removed All and used this choices = unique(penguins$species) (see below), the the shiny app will show the column as a factor, but now I could not choose All
library(shiny)
library(palmerpenguins)
# Load the palmerpenguins dataset
data("penguins")
# Define UI
ui <- fluidPage(
titlePanel("Penguin Species Selector"),
sidebarLayout(
sidebarPanel(
selectInput("species", "Select Species:",
choices = unique(penguins$species)),
hr(),
helpText("Select a species to view its data.")
),
mainPanel(
tableOutput("penguin_table")
)
)
)
# Define server logic
server <- function(input, output) {
output$penguin_table <- renderTable({
if (input$species == "All") {
return(penguins)
} else {
return(subset(penguins, species == input$species))
}
})
}
# Run the application
shinyApp(ui = ui, server = server)
>Solution :
This is because factors are internally stored as numbers. If you run the code in the console it will be clear what is happening.
c("All", unique(penguins$species))
#[1] "All" "1" "3" "2"
A simple fix would be to to turn the species to characters while passing it into selectInput.
c("All", unique(as.character(penguins$species)))
#[1] "All" "Adelie" "Gentoo" "Chinstrap"
Complete code –
library(shiny)
library(palmerpenguins)
# Load the palmerpenguins dataset
data("penguins")
# Define UI
ui <- fluidPage(
titlePanel("Penguin Species Selector"),
sidebarLayout(
sidebarPanel(
selectInput("species", "Select Species:",
choices = c("All", unique(as.character(penguins$species)))),
hr(),
helpText("Select a species to view its data.")
),
mainPanel(
tableOutput("penguin_table")
)
)
)
# Define server logic
server <- function(input, output) {
output$penguin_table <- renderTable({
if (input$species == "All") {
return(penguins)
} else {
return(subset(penguins, species == input$species))
}
})
}
# Run the application
shinyApp(ui = ui, server = server)


