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

如何在Shiny中动态展示时间序列图的年度均值?

问题诊断与修复方案

核心错误点

  1. 均值计算逻辑错误
    在group1和group2的反应式表达式中,mean(input$ycol1)直接传入了变量名字符串,而非对应的数据列。mean()函数无法对字符串计算均值,导致生成的均值数据全为NA,均值线自然无法显示。需要使用.data代词来引用动态选择的列,同时添加na.rm = TRUE避免缺失值干扰:

    summarise(mean = mean(.data[[input$ycol1]], na.rm = TRUE))
    
  2. 均值线数据引用错误
    第二条geom_line错误复用了group1()的数据,应该改为对应第二个数据集的group2()数据:

    geom_line(aes(x=group2()$years, y = group2()$mean), col='darkgreen')
    
  3. ggplot数据引用不规范
    直接使用db$years这种硬编码方式会破坏Shiny的反应性,建议将数据集传入geom的data参数,配合反应式变量使用,让ggplot能正确响应输入变化。

修正后的完整代码

library(shiny)
library(ggplot2)
library(dplyr)

# 加载参考数据(替换为你的CSV文件路径)
db <- read.csv("your_data.csv", stringsAsFactors = FALSE)
# 若d是独立数据集,请自行加载,此处假设与db一致
d <- db

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput('ycol1', 'Select first Y Variable', names(db)),
      selectInput('size1', 'Select first size variable', names(db)),
      selectInput('ycol2', 'Select second Y Variable', names(d)),
      selectInput('size2', 'Select second size Variable', names(d)),
    ),
    mainPanel(
      plotOutput("plot")
    )
  )
)

server = function(input, output,session) {
  y <- reactive({ db[, input$ycol1] })
  y2 <- reactive({ d[, input$ycol2] })
  size <- reactive({ db[, input$size1] })
  size2 <- reactive({ d[, input$size2] })

  # 修正后的年度均值计算
  group1 <- reactive({
    db %>% 
      group_by(years) %>%
      summarise(mean = mean(.data[[input$ycol1]], na.rm = TRUE), .groups = "drop")
  })
  
  group2 <- reactive({
    d %>% 
      group_by(years) %>%
      summarise(mean = mean(.data[[input$ycol2]], na.rm = TRUE), .groups = "drop")
  })

  output$plot <- renderPlot({
    ggplot() + 
      geom_point(data = db, aes(x=years, y = y(), size = size()), col='red', alpha=0.3) + 
      geom_point(data = d, aes(x=years, y = y2(), size = size2()), col = 'darkgreen', alpha=0.3) +
      geom_line(data = group1(), aes(x=years, y = mean), col='red') +
      geom_line(data = group2(), aes(x=years, y = mean), col='darkgreen') 
  })
  
}

shinyApp(ui,server)

额外说明

  • 若db和d是不同数据集,请确保两者都包含years列且数据格式匹配。
  • .groups = "drop"用于消除dplyr的分组警告,确保结果为普通数据框。
  • na.rm = TRUE可处理数据中的缺失值,避免均值计算返回NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:19:48