RShiny交互式地图报错:逻辑索引向量长度不符问题求助
解决Shiny Leaflet联动下拉选择框的报错问题
嘿,我来帮你搞定这个问题!你遇到的报错是因为数据筛选的写法有误,还有popup部分没有调用筛选后的反应式数据,咱们一步步修正:
错误原因分析
- 数据筛选语法错误:你写的
df <- d[d$T_name == input$input1]少了一个关键的逗号——R会把这个逻辑向量当成列索引来使用,而非筛选行。你的真实数据有9列,需要长度为9的列索引,但筛选生成的逻辑向量长度是25(你的数据行数),这就导致了长度不匹配的报错。正确的行筛选写法应该是d[d$T_name == input$input1, ](逗号表示保留所有列)。 - 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
相关产品推荐
相关产品推荐

