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

R Shiny仪表盘:交互式group_by与summarise绘图问题求助

问题解决:Shiny仪表盘交互式分组绘图报错

问题场景

作为R语言新手,想要开发一个带交互式绘图的Shiny仪表盘:用户选择数据列进行group_by分组,计算Sold列的均值,生成以选中列为X轴、均值为Y轴的图表,但代码运行报错,错误提示group_by中get(input$x)参数无效,且ggplot映射存在问题。

错误信息(翻译后)

Warning: Error in group_by: 添加计算列时出现问题。
由`mutate()`中的错误导致:
! 计算`..1 = get(input$x)`时出错。
由`get()`中的错误导致:
! 无效的第一个参数

...

Warning: Error in ggplot: 映射应使用`aes()`或`aes_()`创建。

错误原因分析

  1. group_by语法问题:在dplyr的tidy评估环境中,get()不能直接用于group_by引用动态输入的列名,需要使用适配tidy eval的语法;
  2. ggplot语法错误:
    • 管道传递数据到ggplot时,无需手动传入原始df,管道会自动传递前面的汇总数据;
    • 代码错误地将geom_point()嵌套在aes()括号内,导致映射语法混乱;
    • 绘图数据是汇总后的结果,X轴应引用汇总后的分组列,而非原始数据列。

修正后的完整代码

library(tidyverse)
library(shiny)
library(shinydashboard)

# 原始数据
df <- 
  data.frame(
    Car_Col = c("Red","Blue","Red","Black","white","Black","Black","White","Red","Blue"),
    Car_Type = c("E","G","D","G","G","D","G","D","E","G"),
    Sold = c(1,0,1,0,0,0,1,1,0,0)
  )

## UI部分
ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
      selectInput(
        inputId = "x",
        label = "选择分组变量",
        choices = c("Car_Col","Car_Type"), 
        selected = "Car_Col"
      )
    ),
    plotOutput("graph1")
  )
)

## Server部分
server <- function(input, output) { 
  output$graph1 <- renderPlot({
    df %>% 
      # 用.data[[input$x]]动态引用分组列,适配tidy eval环境
      group_by(.data[[input$x]]) %>% 
      summarise(Avg_Sold = mean(Sold), .groups = "drop") %>% # .groups="drop"替代ungroup()更简洁
      # 管道传递汇总数据到ggplot,直接使用动态列和均值列做映射
      ggplot(aes(x = .data[[input$x]], y = Avg_Sold, group = 1)) +
      geom_point(size = 2) +
      geom_line()
  })
}

shinyApp(ui, server)

关键修正点说明

  • 分组语法优化:用.data[[input$x]]替代get(input$x),这是dplyr官方推荐的动态列引用方式,完美适配tidy评估规则;
  • ggplot语法修正:调整了geom函数的位置,确保语法结构正确,同时直接使用管道传递的汇总数据,避免重复指定数据源;
  • 汇总逻辑简化:用summarise的.groups = "drop"参数替代单独的ungroup(),更简洁地完成分组取消操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:15:38