R Shiny用sliderInput筛选租金数据报逻辑值缺失错误排查
问题定位
触发Error in if: missing value where TRUE/FALSE needed的核心原因:
- 滑块控件初始值配置不合理:你在UI中将租金滑块的初始值设为100,但从提供的样例数据看,数据集内最低租金为411.5,初始筛选条件
Rental Cost` <= 100会返回0行的空sf空间对象。 - 空对象兼容缺失:tmap的
tm_shape接收0行空间数据时,内部渲染逻辑会对空边界框做条件判断,此时传入判断的是NA值,R的if语句仅接受TRUE/FALSE作为判断输入,直接抛出报错。 - 初始化时序风险:Shiny控件初始化阶段
input$RentCost会短暂为NULL,此时执行筛选逻辑会生成无效值,也可能触发同类报错。
修复代码
1. 调整UI滑块配置
不要硬编码滑块范围和初始值,直接绑定数据集的实际租金区间,保证初始加载时筛选结果非空:
# 若数据集是全局加载的,直接在UI中按实际值配置滑块 sliderInput("RentCost", "Rental Cost:", min = floor(min(residential_data_sf$`Rental Cost`, na.rm = TRUE)), max = ceiling(max(residential_data_sf$`Rental Cost`, na.rm = TRUE)), value = median(residential_data_sf$`Rental Cost`, na.rm = TRUE) )
2. 优化Server端筛选逻辑
加入输入校验和空值过滤,避免无效输入触发异常:
buildingData <- reactive({ # 等待滑块输入初始化完成再执行后续逻辑 req(input$RentCost) residential_data_sf %>% # 先过滤租金列的缺失值,避免NA值导致筛选结果异常 filter(!is.na(`Rental Cost`), `Rental Cost` <= input$RentCost) })
3. 给图层渲染加空数据兜底
筛选结果为空时不要直接传入空对象给tmap,增加判断逻辑:
# 放在renderTmap({}) 渲染块内 map_data <- buildingData() if (nrow(map_data) == 0) { # 无匹配数据时返回提示,可根据需求自定义展示样式 tm_shape(map_data) + tm_text("当前租金区间无匹配公寓", col = "red", size = 1.2) } else { tm_shape(map_data) + tm_bubbles( col = "Shared Apartment", size = "Rental Cost", border.col = "black", border.lwd = 1 ) }
可选优化
你数据集中的Shared Apartment、Vacancy列目前存储为字符串格式的"True"/"False",建议在数据预处理阶段转为正式逻辑值,避免tmap做分类映射时出现异常:
residential_data_sf <- residential_data_sf %>% mutate( `Shared Apartment` = as.logical(`Shared Apartment`), Vacancy = as.logical(Vacancy) )
内容的提问来源于stack exchange,提问作者Rshiny Learner
相关产品推荐
相关产品推荐

