| library(shiny) |
| library(bslib) |
| library(dplyr) |
| library(ggplot2) |
|
|
| df <- readr::read_csv("penguins.csv") |
| |
| df_num <- df |> select(where(is.numeric), -Year) |
|
|
| ui <- page_sidebar( |
| theme = bs_theme(bootswatch = "minty"), |
| title = "Penguins explorer", |
| sidebar = sidebar( |
| varSelectInput("xvar", "X variable", df_num, selected = "Bill Length (mm)"), |
| varSelectInput("yvar", "Y variable", df_num, selected = "Bill Depth (mm)"), |
| checkboxGroupInput("species", "Filter by species", |
| choices = unique(df$Species), selected = unique(df$Species) |
| ), |
| hr(), |
| checkboxInput("by_species", "Show species", TRUE), |
| checkboxInput("show_margins", "Show marginal plots", TRUE), |
| checkboxInput("smooth", "Add smoother"), |
| ), |
| 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(!!input$xvar, !!input$yvar)) + |
| theme_light() + |
| list( |
| theme(legend.position = "bottom"), |
| if (input$by_species) aes(color = Species), |
| geom_point(), |
| if (input$smooth) geom_smooth() |
| ) |
|
|
| if (input$show_margins) { |
| margin_type <- if (input$by_species) "density" else "histogram" |
| p <- p |> ggExtra::ggMarginal( |
| type = margin_type, margins = "both", |
| size = 8, groupColour = input$by_species, groupFill = input$by_species |
| ) |
| } |
|
|
| p |
| }, |
| res = 100 |
| ) |
| } |
|
|
| shinyApp(ui, server) |
|
|