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

RShiny交互式地图报错:逻辑索引向量长度不符问题求助

解决Shiny Leaflet联动下拉选择框的报错问题

嘿,我来帮你搞定这个问题!你遇到的报错是因为数据筛选的写法有误,还有popup部分没有调用筛选后的反应式数据,咱们一步步修正:

错误原因分析

  1. 数据筛选语法错误:你写的df <- d[d$T_name == input$input1]少了一个关键的逗号——R会把这个逻辑向量当成列索引来使用,而非筛选行。你的真实数据有9列,需要长度为9的列索引,但筛选生成的逻辑向量长度是25(你的数据行数),这就导致了长度不匹配的报错。正确的行筛选写法应该是d[d$T_name == input$input1, ](逗号表示保留所有列)。
  2. Popup未使用反应式数据:你在addMarkers里用了paste(d$m_name),这会调用原始数据的所有名字,而非当前筛选后的结果,需要换成paste(react()$m_name)。

修正后的完整代码

首先定义数据框(建议用tibble替代旧版的data_frame)

library(tibble)
d <- tibble(
  number = 1:4, 
  date = c(1600, 1700, 1800, 1900), 
  T_name = c("name1", "name2", "name3", "name4"), 
  casualties= c(18, 89, 97, 34), 
  m_name= c("name1", "name2", "name3", "name4"), 
  longitude = c(87.7, 103.2, 67.0, 76.8), 
  latitude = c(23.4, 78.3, 78.9, 34.9)
)

UI部分(基本不变,确保加载所需包)

library(shiny) 
library(leaflet) 

ui <- fluidPage(
  "app title", 
  sidebarLayout(
    sidebarPanel(
      selectInput(
        inputId = "input1", 
        label = "Name", 
        choices = unique(d$T_name)
      )
    ), 
    mainPanel(
      leafletOutput("mymap")
    )
  )
)

Server部分(修正数据筛选和popup逻辑)

server <- function(input, output) {
  react <- reactive({
    req(input$input1)
    # 修正:添加逗号,筛选行并保留所有列
    df <- d[d$T_name == input$input1, ]
    df
  })
  
  output$mymap <- renderLeaflet({
    req(input$input1)
    leaflet() %>% 
      addTiles() %>% 
      setView(lng = -100.94, lat = 38.94, zoom = 3.5) %>% 
      addProviderTiles(providers$Esri.NatGeoWorldMap) %>% 
      # 修正:使用反应式数据里的字段,而非原始数据d
      addMarkers(
        lng = react()$longitude, 
        lat = react()$latitude, 
        popup = paste("Name:", react()$m_name, "<br>Casualties:", react()$casualties)
      )
  })
}

运行App

shinyApp(ui, server)

额外优化建议

  • 如果你的真实数据中T_name有重复值,unique(d$T_name)可以正常生成唯一选项,也可以用sort(unique(d$T_name))让下拉选项按顺序排列。
  • Popup里可以加入更多字段信息(比如示例里的伤亡数),让地图标记的信息更丰富实用。

内容的提问来源于stack exchange,提问作者Mrmoleje

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:31