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

