Shiny中按Especialidad分组统计指定范围数据占比的实现问题
问题分析
原有代码存在多个明显错误,导致无法实现预期效果:
- 变量名、字段名混乱:混用
BD9.4/BDa4、Especialidad/specialty.name,未定义的Cumplimiento字段直接使用 - 区间判断逻辑错误:多次replace操作逻辑冲突,根本无法正确判断数值是否在选中区间内
- 依赖关系处理错误:
minn/maxx是renderUI内的局部变量,响应式函数BD9.5中无法直接访问 - 循环计算占比效率极低:数据量大时性能卡顿,完全可以用分组统计函数替代
可行实现方案
依赖dplyr包实现简洁高效的统计逻辑,适合大数据量场景:
# 提前加载依赖 library(shiny) library(dplyr) # 原有动态生成slider的逻辑保留即可,无需修改 output$Rango<-renderUI({ req(input$SeleccioneIndice) minn <- min(BD9.3()[,input$SeleccioneIndice], na.rm = TRUE) maxx <- max(BD9.3()[,input$SeleccioneIndice], na.rm = TRUE) sliderInput("Rango",label = "Seleccione un rango", min = minn, max=maxx, value=c(minn,maxx)) }) # 重写统计逻辑 BD9.5 <- reactive({ # 声明必填依赖,避免加载时报错 req(input$SeleccioneIndice, input$Rango) df <- BD9.3() # 取选中区间上下限 range_low <- input$Rango[1] range_high <- input$Rango[2] # 区间打标+统计 stat_df <- df %>% # 不需要过滤空值可删掉此行 filter(!is.na(Especialidad), !is.na(.data[[input$SeleccioneIndice]])) %>% # 一步判断是否在区间内 mutate(Intervalo = if_else( .data[[input$SeleccioneIndice]] >= range_low & .data[[input$SeleccioneIndice]] <= range_high, "Correcto", "Fallo" )) %>% # 按分组统计次数、占比 group_by(Especialidad, Intervalo) %>% summarise(Total = n(), .groups = "drop_last") %>% mutate(Porcentaje = round(Total / sum(Total) * 100, 2)) %>% ungroup() %>% arrange(Especialidad, Intervalo) return(stat_df) }) # 输出统计结果 output$summary9 <- renderPrint({ res <- BD9.5() # 只显示符合区间的统计就保留下面的过滤,要显示所有结果就删掉 res <- res %>% filter(Intervalo == "Correcto") %>% arrange(desc(Porcentaje)) print(res) })
补充提示:你给出的示例数据集代码里有几个拼写错误:
dataframe应改为data.frame,数字06、032应改为0.6、0.32,另外定义的列名有Indicea、Indiced,但创建数据集时写了Indiceb、Indicec,运行前要先修正这些问题避免报错。
内容的提问来源于stack exchange,提问作者ErikaC
相关产品推荐
相关产品推荐

