Shiny中ungroup与select操作结果与非Shiny场景不一致问题咨询
Shiny中dplyr逻辑结果与本地运行不一致的原因解释
核心问题原因
dplyr 的分组、列选择等动词遵循**整洁评估(tidy evaluation)**语法规则,你在 Shiny 代码中直接把input$pickvalue作为参数传入group_by时,dplyr 不会将这个字符串类型的输入值识别为数据框的对应列名,而是将其当作一个固定的全局字符串常量处理,分组逻辑从根源上就完全偏离预期:
- 第一次
group_by没有按照你选择的列(比如对照场景的mpg)分组,tally输出的计数结果本身就是错误的,并非ungroup没有生效 - 后续第二次
group_by也存在同样的问题,sum(Count)的计算范围完全不符合预期,最终输出结果自然和本地对照代码不一致。
你注释掉的select语句触发警告也是同样的原因:直接传入字符串无法被识别为列名。
修复方案
只需要将所有用到input$pickvalue作为列名的位置,替换为dplyr官方推荐的动态列引用写法.data[[input$pickvalue]]即可,修改后的reactive部分代码如下:
gears <- reactive({ dat <- mtcars_rdpr if (!is.null(input$pickvalue)){ target_col <- input$pickvalue dat <- dat %>% group_by(wt, gear, .data[[target_col]]) %>% tally() %>% ungroup() %>% group_by(gear, .data[[target_col]]) %>% rename(Count = n) %>% mutate(summ = sum(Count), Percentage = round((Count/summ)*100, 2)) # 取消注释也不会触发警告 # dat <- dat %>% select(-.data[[target_col]]) } return(dat) })
修改后运行Shiny选择mpg作为输入时,输出结果就会和本地对照代码完全一致。
内容的提问来源于stack exchange,提问作者WolfgangBagdanow
相关产品推荐
相关产品推荐

