You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

利用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" in v1, v2 will only show medals associated with England teams). We use renderUI to generate these inputs dynamically and uiOutput to 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 v4 and v5 with 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:15:24