R语言Shiny添加Checkbox过滤功能时filter()报错如何解决
问题原因
核心错误分为两点:
- 第一,
prettyCheckboxGroup未勾选时,input$phones返回长度为0的空字符向量,直接执行input$phones == "Yes"会返回长度为0的逻辑值,和后续长度等于数据集行数的列判断条件拼接时,就会触发长度不匹配的报错。 - 第二,
case_when的默认分支逻辑错误,!is.na(temp_data$phone) & is.na(temp_data$phone)是恒假逻辑,即使解决长度问题,未勾选时也会返回空数据集,不符合保留所有记录的需求。
另外你在dplyr::filter()中重复写temp_data$前缀属于冗余写法,虽然不直接报错但不符合dplyr语法规范,建议去掉。
修复方案
只需要替换filtered_data响应式变量里的过滤逻辑即可,修改后的完整filtered_data代码如下:
filtered_data <- reactive({ temp_data <- df if (input$data1 != "All") { temp_data <- temp_data[temp_data$state == input$data1, ] } if (input$data2 != "All") { temp_data <- temp_data[temp_data$county == input$data2, ] } if (input$data3 != "All") { temp_data <- temp_data[temp_data$city == input$data3, ] } if (input$data4 != "All") { temp_data <- temp_data[temp_data$demo == input$data4, ] } if (input$data5 != "All") { temp_data <- temp_data[temp_data$status == input$data5, ] } # 判断是否勾选了有效手机号筛选 phone_filter_on <- "Yes" %in% input$phones temp_data %>% filter(age >= input$age[1], age <= input$age[2], score1 >= input$score1[1], score1 <= input$score1[2], score2 >= input$score2[1], score2 <= input$score2[2], # 勾选时仅保留非NA手机号,未勾选时该条件恒为真不限制 if(phone_filter_on) !is.na(phone) else TRUE) })
逻辑说明
- 用
"Yes" %in% input$phones判断是否勾选了筛选选项,避免未勾选时input$phones为空导致的判断错误 - 把原来用
&拼接的多个过滤条件改成用逗号分隔,符合dplyr filter的写法,可读性更高 - 手机号筛选条件直接用if-else判断:勾选时执行非NA校验,未勾选时返回TRUE,不对手机号做任何限制,完全符合预期需求。
内容的提问来源于stack exchange,提问作者wizkids121
相关产品推荐
相关产品推荐

