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

Shiny中renderTmap条件分支失效致地图不渲染问题排查

问题分析与修复

问题描述

原本可正常运行的代码行是p1+p2+p3+p4+show,但注释该行并启用被注释的多条件分支代码后,Shiny应用能正常启动,但关联的地图无法渲染,报错argument is of length zero。

问题原因

  1. 输入ID拼写错误:多条件分支的第一个判断条件中,误将input$actions写成了input$action(少了末尾的s)。UI中定义的复选框输入ID是actions,因此input$action是不存在的变量,调用时会返回长度为0的对象,直接触发报错。
  2. 空数据潜在风险:如果日期范围过滤后,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:46:29