Shiny中renderTmap条件分支失效致地图不渲染问题排查
问题分析与修复
问题描述
原本可正常运行的代码行是p1+p2+p3+p4+show,但注释该行并启用被注释的多条件分支代码后,Shiny应用能正常启动,但关联的地图无法渲染,报错argument is of length zero。
问题原因
- 输入ID拼写错误:多条件分支的第一个判断条件中,误将
input$actions写成了input$action(少了末尾的s)。UI中定义的复选框输入ID是actions,因此input$action是不存在的变量,调用时会返回长度为0的对象,直接触发报错。 - 空数据潜在风险:如果日期范围过滤后,
tweets_sf或actions_sf为空,tm_shape处理空的sf对象时,也可能引发类似的长度为0的错误。
修复方案
1. 修正拼写错误
将第一个条件判断中的input$action改为input$actions,确保匹配UI中定义的输入ID。
2. 增加空数据处理逻辑
在绘制图层前,判断数据是否为空,为空则跳过对应图层的绘制,避免无效的tm_shape调用,提升代码健壮性。
修改后的Server代码示例
output$geo2 <- renderTmap({ tweets_sf %<>% filter(date>=input$daterange[1],date<=input$daterange[2]) actions_sf <- actions %>% filter(incident_date >= input$daterange[1],incident_date <= input$daterange[2]) %>% st_as_sf(coords = c("lon","lat"),crs=4326) %>% st_cast("POINT") tmap_mode("view") # 基础图层 p1 <- tm_shape(usa) + tm_fill("#acc480",alpha = 0.4,id = "NAME") p2 <- tm_shape(usa) + tm_borders("black", lwd = .5) show <- tm_view(set.view = c(-98.5795,39.8283,4)) # 初始化最终地图对象 final_map <- p1 + p2 + show # 根据复选框状态和数据非空判断,动态添加图层 if(input$actions == TRUE && nrow(actions_sf) > 0){ p3 <- tm_shape(actions_sf) + tm_text("target_type", size = 1,scale=1) + tm_symbols(col = "brown1",shape = "target_type",shapes = rep(5,6), size = 1,alpha=0.4, scale = .25) + tm_legend(show = TRUE) final_map <- final_map + p3 } if(input$tweets == TRUE && nrow(tweets_sf) > 0){ p4 <- tm_shape(tweets_sf) + tm_text("ngram", size = 1,scale=.7) + tm_symbols(col = "deepskyblue1", id = "date", size = 1,alpha=0.4, scale = 0.15,palette = "RdBu") + tm_legend(show = TRUE) final_map <- final_map + p4 } final_map })
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

