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
相关产品推荐
相关产品推荐

