R Shiny构建奥运奖牌交互式地图时medalt未找到错误如何解决
问题排查与修复方案
核心错误原因
- 动态列调用错误:
input$medal返回的是奖牌类型的字符串,直接传入sum()会对字符串求和而非对对应数据列求和,dplyr环境下引用动态列名需要用.data[[列名]]语法 - 变量作用域错误:
medalt是CountryOly()返回的data.frame的列,不能直接在全局/函数环境下直接调用,需要显式指定所属数据集 - 响应式对象调用错误:
pat、CountryOly都是响应式对象,调用时必须加(),不能直接像普通变量一样使用 colorBin使用语法错误:不能直接对数据集管道调用colorBin,该函数返回的是调色板映射函数,需要单独指定映射值域
修复后完整代码
library(shiny) library(dplyr) library(ggplot2) library(readr) library(htmltools) library(leaflet) library(geojsonio) ui <- fluidPage( selectInput (inputId = "medal", label = "Choose medal", list("Gold", "Silver", "Bronze", "Total")), leafletOutput("Olymap")) server <- function(input, output) { shapeurl <- "https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json" WorldCountry <- geojson_read(shapeurl, what = "sp") Olympics<- read.csv("Olympics.csv") groupcountry <- Olympics[, c(2, 10, 11, 12, 13)] Oly_react <- reactive ({ groupcountry %>% group_by(Country) %>% summarise(medalt = sum(.data[[input$medal]])) }) CountryOly <- reactive({ left_join(data.frame(Name = WorldCountry$name), Oly_react(), by = c("Name" ="Country")) }) pat <- reactive({ colorBin("viridis", domain = CountryOly()$medalt, na.color = "transparent") }) Pops <- reactive({ paste("<strong>", CountryOly()$Name, "</strong>", "<br/>", input$medal, "奖牌数:", CountryOly()$medalt) }) output$Olymap <-renderLeaflet({ leaflet(WorldCountry) %>% addTiles() %>% addPolygons( fillColor = pat()(CountryOly()$medalt), weight = 2, opacity = 1, color = "white", fillOpacity = 0.7, highlight = highlightOptions( weight = 3, color = "grey", fillOpacity = 0.7, bringToFront = TRUE), popup = Pops()) }) } shinyApp(ui = ui, server = server)
额外优化建议
- 读取
Olympics.csv后先检查国家名拼写,避免和GeoJSON中的国家名不匹配导致NA值 - 可以根据数据范围调整
colorBin的分箱规则,让地图颜色区分度更高
内容的提问来源于stack exchange,提问作者Tom J
相关产品推荐
相关产品推荐

