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

Shiny应用group_by_弃用替换group_by后图表异常及冻结问题

Shiny应用密度图分组问题解决

问题说明

  • 预期图表样式:按年份分组的分类密度条形图,不同年份的同分类密度以并排条形展示,可直观对比各年份分类占比
  • 遇到的问题:使用旧版函数group_by_时触发弃用警告,且导致应用冻结;改用group_by后,图表样式异常,分类分组逻辑错误,无法呈现预期的并排条形效果

原始代码片段

# Density plot
output$densityplot <- renderPlotly({
datacount = data.frame()
  
year_selected <- input$my_selected4
for (i in year_selected) {
  datacount_temp <- get(i) %>% 
      group_by_(input$variable_selected) %>%
      count(input$variable_selected) %>%
      ungroup() %>%
      mutate(MY = i)
    datacount <- rbind(datacount,datacount_temp)
}

  datacount <- datacount %>% group_by(MY) %>% mutate(density = n/sum(n))
  colnames(datacount)[1] <- "category"

问题根源与修复方案

问题核心是动态变量的整洁评估处理:group_by_是旧版标准评估函数已被弃用,而直接传递字符串给group_by无法被正确识别为列名,导致分组逻辑错误。

以下两种方法可正确实现动态列分组:

方法1:使用.data代词(推荐,无需额外包)

通过.data[[变量名]]的形式,明确告诉dplyr要引用数据框中的对应列:

datacount_temp <- get(i) %>% 
    group_by(.data[[input$variable_selected]]) %>%
    count(.data[[input$variable_selected]]) %>%
    ungroup() %>%
    mutate(MY = i)

方法2:使用整洁评估语法(需加载rlang包)

将字符串转为符号后用!!注入到group_by和count中:

library(rlang)
datacount_temp <- get(i) %>% 
    group_by(!!sym(input$variable_selected)) %>%
    count(!!sym(input$variable_selected)) %>%
    ungroup() %>%
    mutate(MY = i)

完整修复后代码

# Density plot
output$densityplot <- renderPlotly({
  datacount <- data.frame()
  
  year_selected <- input$my_selected4
  for (i in year_selected) {
    datacount_temp <- get(i) %>% 
        group_by(.data[[input$variable_selected]]) %>%
        count(.data[[input$variable_selected]]) %>%
        ungroup() %>%
        mutate(MY = i)
      datacount <- rbind(datacount, datacount_temp)
  }

  datacount <- datacount %>% 
    group_by(MY) %>% 
    mutate(density = n/sum(n)) %>%
    rename(category = 1) # 用rename替代colnames修改,更符合tidyverse规范
})

修复后,group_by能正确按动态选择的列分组,生成的数据结构与原group_by_逻辑一致,即可还原预期的图表样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:30:55