利用renderUI与uiOutput构建R Shiny团队数据对比可视化仪表盘
Here's a complete R Shiny dashboard that meets your requirements—using renderUI/uiOutput for dynamic inputs, letting you filter teams by v1, v2, v3, and visualize v4/v5 as bar charts:
library(shiny) library(ggplot2) library(dplyr) # Sample dataset data <- tibble( Team = c("A", "B", "C", "D"), v1 = c("England", "England", "Wales", "USA"), v2 = c("Gold", "Silver", NA, "Silver"), v3 = c("Red", "Blue", "Blue", "Red"), v4 = c(50, 30, 40, 50), v5 = c(NA, 40, 30, 20) ) ui <- fluidPage( titlePanel("Team Performance Comparison Dashboard"), sidebarLayout( sidebarPanel( # Dynamic inputs rendered via uiOutput uiOutput("v1_filter"), uiOutput("v2_filter"), uiOutput("v3_filter"), uiOutput("metric_selector") ), mainPanel( plotOutput("performance_barplot") ) ) ) server <- function(input, output) { # Dynamic filter for v1 (Country) output$v1_filter <- renderUI({ selectInput( inputId = "selected_v1", label = "Filter by Country (v1):", choices = c("All", unique(na.omit(data$v1))), selected = "All" ) }) # Dynamic filter for v2 (Medal) - updates based on v1 selection output$v2_filter <- renderUI({ # Filter data based on current v1 selection filtered_for_v2 <- if (input$selected_v1 != "All") { data %>% filter(v1 == input$selected_v1) } else { data } selectInput( inputId = "selected_v2", label = "Filter by Medal (v2):", choices = c("All", unique(na.omit(filtered_for_v2$v2))), selected = "All" ) }) # Dynamic filter for v3 (Color) - updates based on v1 and v2 selections output$v3_filter <- renderUI({ filtered_for_v3 <- data if (input$selected_v1 != "All") { filtered_for_v3 <- filtered_for_v3 %>% filter(v1 == input$selected_v1) } if (input$selected_v2 != "All") { filtered_for_v3 <- filtered_for_v3 %>% filter(v2 == input$selected_v2) } selectInput( inputId = "selected_v3", label = "Filter by Color (v3):", choices = c("All", unique(na.omit(filtered_for_v3$v3))), selected = "All" ) }) # Dynamic selector for which metric to plot (v4 or v5) output$metric_selector <- renderUI({ selectInput( inputId = "selected_metric", label = "Choose Metric to Visualize:", choices = c("v4", "v5"), selected = "v4" ) }) # Reactive dataset that updates with filter selections filtered_data <- reactive({ data_filtered <- data # Apply filters step-by-step if (input$selected_v1 != "All") { data_filtered <- data_filtered %>% filter(v1 == input$selected_v1) } if (input$selected_v2 != "All") { data_filtered <- data_filtered %>% filter(v2 == input$selected_v2) } if (input$selected_v3 != "All") { data_filtered <- data_filtered %>% filter(v3 == input$selected_v3) } # Remove rows where the selected metric is NA data_filtered %>% filter(!is.na(!!sym(input$selected_metric))) }) # Render the bar chart output$performance_barplot <- renderPlot({ # Ensure we have data before plotting req(filtered_data()) ggplot(filtered_data(), aes(x = Team, y = !!sym(input$selected_metric), fill = Team)) + geom_bar(stat = "identity") + labs( title = paste("Team Performance:", input$selected_metric), x = "Team", y = paste("Value of", input$selected_metric) ) + theme_minimal() + theme(legend.position = "none") }) } # Run the app shinyApp(ui = ui, server = server)
Key Features Explained:
- Dynamic Inputs: Each filter (
v1,v2,v3) updates based on previous selections (e.g., if you pick "England" inv1,v2will only show medals associated with England teams). We userenderUIto generate these inputs dynamically anduiOutputto display them. - NA Handling: The code automatically omits NA values from filter choices and removes rows where the selected metric (
v4/v5) is NA, so you don't get broken plots. - Flexible Visualization: You can switch between plotting
v4andv5with a dropdown, and the chart updates instantly. - Reactive Data: The
filtered_data()reactive object ensures the dataset stays in sync with your filter selections, so the plot always shows the correct teams.
You can customize this further by adding more plot types (like grouped bars if needed), adjusting colors, or adding additional filters—just extend the renderUI sections and update the filtered_data reactive.
内容的提问来源于stack exchange,提问作者adamjhodgson
相关产品推荐
相关产品推荐

