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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:15:03