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

Shiny应用开发求助:ggplot与均值计算代码错误修正

修正后的Shiny应用代码
library(shiny)
library(ggplot2)
library(dplyr)

# 模拟示例数据(实际使用时替换为你的真实数据)
set.seed(123)
df <- tibble(
  profession = sample(c("医生", "护士", "药师"), 100, replace = TRUE),
  Q1 = sample(1:5, 100, replace = TRUE),
  Q2 = sample(1:5, 100, replace = TRUE),
  Q3 = sample(1:5, 100, replace = TRUE),
  Q4 = sample(1:5, 100, replace = TRUE),
  Q5 = sample(1:5, 100, replace = TRUE),
  Q6 = sample(1:5, 100, replace = TRUE),
  Q7 = sample(1:5, 100, replace = TRUE),
  Q8 = sample(1:5, 100, replace = TRUE),
  Q9 = sample(1:5, 100, replace = TRUE),
  Q10 = sample(1:5, 100, replace = TRUE),
  Q11 = sample(1:5, 100, replace = TRUE),
  Q12 = sample(1:5, 100, replace = TRUE),
  Q13 = sample(1:5, 100, replace = TRUE),
  Q14 = sample(1:5, 100, replace = TRUE),
  Q15 = sample(1:5, 100, replace = TRUE),
  Q16 = sample(1:5, 100, replace = TRUE),
  Q17 = sample(1:5, 100, replace = TRUE),
  Q18 = sample(1:5, 100, replace = TRUE),
  Q19 = sample(1:5, 100, replace = TRUE),
  Q20 = sample(1:5, 100, replace = TRUE)
)

ui <- fluidPage(
  selectInput("prof", "选择从业者群体", choices = unique(df$profession)),
  selectInput("q", "选择问题", choices = paste0("Q", 1:20)),
  plotOutput("bar_plot"),
  verbatimTextOutput("stats")
)

server <- function(input, output) {
  # 生成过滤后的数据响应式对象
  filtered_data <- reactive({
    df %>% filter(profession == input$prof)
  })
  
  output$bar_plot <- renderPlot({
    # 修正点1:用.data[[input$q]]动态引用列
    ggplot(filtered_data(), aes(x = factor(.data[[input$q]]))) +
      geom_bar(fill = "#2c3e50") +
      labs(x = input$q, y = "频次", title = paste(input$q, "回答频次分布")) +
      theme_minimal()
  })
  
  output$stats <- renderPrint({
    # 修正点2:提取对应列再计算统计量
    selected_col <- filtered_data()[[input$q]]
    mean_val <- mean(selected_col, na.rm = TRUE)
    sd_val <- sd(selected_col, na.rm = TRUE)
    cat(paste0("均值(Mean): ", round(mean_val, 2), "\n标准差(SD): ", round(sd_val, 2)))
  })
}

shinyApp(ui, server)

错误修正说明

  • ggplot动态x轴问题:input$q是字符串类型的列名,ggplot的aes无法直接识别。用.data[[input$q]]可以动态调用数据框中对应名称的列,同时转成factor让x轴显示1-5的离散刻度,更符合李克特量表的可视化需求。
  • 均值/标准差计算问题:不能直接把input$q当作列名进行计算,需要先从过滤后的数据里提取对应列的向量(filtered_data()[[input$q]]),再对这个向量计算均值和标准差,加上na.rm = TRUE还能处理数据中的缺失值。

内容的提问来源于stack exchange,提问作者yusefsoliman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:15:28