library(shiny) library(bslib) library(dplyr) library(ggplot2) df <- readr::read_csv("penguins.csv") # Find subset of columns that are suitable for scatter plot df_num <- df |> select(where(is.numeric), -Year) ui <- page_fillable( theme = bs_theme(bootswatch = "minty"), layout_sidebar( sidebar( varSelectInput("xvar", "X variables", df_num, selected = "Bill Length (mm)"), varSelectInput("yvar", "Y variables", df_num, selected = "Bill Depth (mm)"), checkboxGroupInput("species", "Filter by species", choices = unique(df$Species), selected = unique(df$Species) ) ), plotOutput("scatter") ) ) server <- function(input, output, session) { subsetted <- reactive({ req(input$species) df |> filter(Species %in% input$species) }) output$scatter <- renderPlot({ p <- ggplot(subsetted(), aes(.data[[input$xvar]], .data[[input$yvar]])) + theme(legend.position = "bottom") p }) } shinyApp(ui, server)