【问题标题】:Interactive choropleth map with Leaflet and Shiny带有 Leaflet 和 Shiny 的交互式等值线图
【发布时间】:2016-07-06 13:33:20
【问题描述】:

我正在尝试修改此repo 以显示等值线地图并使用滑块输入来更新地图。一切都好,直到我尝试为滑块输入设置动画,没有任何反应。我收到此控制台错误:input_binding_slider.js:199 Uncaught TypeError: Cannot read property 'options' of undefined。

这是我正在使用的代码:

library(dplyr) ; library(rgdal) ; library(leaflet)

gdp = read.csv("mexico2.csv", header= T) %>%
  as.data.frame()

mexico <- readOGR("mexico.shp", layer = "mexico", encoding = "UTF-8")

ui <- shinyUI(fluidPage(
  fluidRow(
    column(7, offset = 1,
           br(),
           div(h4(textOutput("title"), align = "center"), style = "color:black"),
           div(h5(textOutput("period"), align = "center"), style = "color:black"),
           br())),
  fluidRow(
    column(7, offset = 1,
           leafletOutput("map", height="530"),
           br(),
           actionButton("reset_button", "Reset view")),
    column(3,
           uiOutput("category", align = "left")))
))

server <- (function(input, output, session) {

  output$category <- renderUI({
    sliderInput("category", "Year:",
                 min=1994, max = 1999,
                 value = 1994, sep = "", animate=TRUE)
  })  

  selected <- reactive({
    subset(gdp,
           category==input$category)
  })

  output$title <- renderText({
    req(input$category)
    paste0(input$category, " GDP by State")
  })

  output$period <- renderText({
    req(input$category)
    paste("...")
  })

  lat <- 23
  lng <- -102
  zoom <- 5

  output$map <- renderLeaflet({

    leaflet() %>% 
      addProviderTiles("CartoDB.Positron") %>% 
      setView(lat = lat, lng = lng, zoom = zoom)
  })

  observe({
    mexico@data <- left_join(mexico@data, selected())

    qpal <- colorQuantile("YlGn", mexico$value, n = 5, na.color = "#bdbdbd")

    popup <- paste0("<strong>ID: </strong>",
                    mexico$id,
                    "<br><strong>Estado: </strong>",
                    mexico$name,
                    "<br><strong>Valor: </strong>",
                    mexico$value)

    leafletProxy("map", data = mexico) %>%
      addProviderTiles("CartoDB.Positron") %>% 
      clearShapes() %>% 
      clearControls() %>% 
      addPolygons(data = mexico, fillColor = ~qpal(value), fillOpacity = 0.7, 
                  color = "white", weight = 2, popup = popup) %>%
      addLegend(pal = qpal, values = ~value, opacity = 0.7,
                position = 'bottomright', 
                title = paste0(input$category, "<br>"))
  })

  observe({
    input$reset_button
    leafletProxy("map") %>% setView(lat = lat, lng = lng, zoom = zoom)
  })      

})

shinyApp(ui, server)

这是shinyapp的链接

我们将不胜感激。 谢谢!

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    这只是一个命名错误。您将htmlOutput 命名为sliderOutput 用于“类别”。在内部,这把事情搞砸了。

    只需更改,例如输出到

    uiOutput("categoryOutput", align = "left")
    

    output$categoryOutput <- renderUI({ ... })
    

    你应该很高兴。

    编辑:完整代码

    library(dplyr) ; library(rgdal) ; library(leaflet)
    
    gdp = read.csv("mexico2.csv", header= T) %>%
      as.data.frame()
    
    mexico <- readOGR("mexico.shp", layer = "mexico", encoding = "UTF-8")
    
    ui <- shinyUI(fluidPage(
      fluidRow(
        column(7, offset = 1,
               br(),
               div(h4(textOutput("title"), align = "center"), style = "color:black"),
               div(h5(textOutput("period"), align = "center"), style = "color:black"),
               br())),
      fluidRow(
        column(7, offset = 1,
               leafletOutput("map", height="530"),
               br(),
               actionButton("reset_button", "Reset view")),
        column(3,
               uiOutput("categoryOut", align = "left")))
    ))
    
    server <- (function(input, output, session) {
    
      output$categoryOut <- renderUI({
        sliderInput("category", "Year:",
                     min=1994, max = 1999,
                     value = 1994, sep = "", animate=TRUE)
      })  
    
      selected <- reactive({
        subset(gdp,
               category==input$category)
      })
    
      output$title <- renderText({
        req(input$category)
        paste0(input$category, " GDP by State")
      })
    
      output$period <- renderText({
        req(input$category)
        paste("...")
      })
    
      lat <- 23
      lng <- -102
      zoom <- 5
    
      output$map <- renderLeaflet({
    
        leaflet() %>% 
          addProviderTiles("CartoDB.Positron") %>% 
          setView(lat = lat, lng = lng, zoom = zoom)
      })
    
      observe({
        mexico@data <- left_join(mexico@data, selected())
    
        qpal <- colorQuantile("YlGn", mexico$value, n = 5, na.color = "#bdbdbd")
    
        popup <- paste0("<strong>ID: </strong>",
                        mexico$id,
                        "<br><strong>Estado: </strong>",
                        mexico$name,
                        "<br><strong>Valor: </strong>",
                        mexico$value)
    
        leafletProxy("map", data = mexico) %>%
          addProviderTiles("CartoDB.Positron") %>% 
          clearShapes() %>% 
          clearControls() %>% 
          addPolygons(data = mexico, fillColor = ~qpal(value), fillOpacity = 0.7, 
                      color = "white", weight = 2, popup = popup) %>%
          addLegend(pal = qpal, values = ~value, opacity = 0.7,
                    position = 'bottomright', 
                    title = paste0(input$category, "<br>"))
      })
    
      observe({
        input$reset_button
        leafletProxy("map") %>% setView(lat = lat, lng = lng, zoom = zoom)
      })      
    
    })
    
    shinyApp(ui, server)
    

    【讨论】:

    • 感谢您的回复,但没有奏效。实际上,在我的帖子之后,我将名称更改为“yearOutput”,因为我认为它更具描述性。但是滑块的问题仍然存在。
    • 好吧,我想知道,因为我得到了Error: Type of h is undefined,所以不是你得到的......
    • @neek05 好吧,不。我刚刚进入您的 shinyserver 网站,除了更改包含滑块的 div 的 id 之外什么也没做。瞧,动画没有错误消息。看这个截图:imgur.com/oIyprzn
    • 这很奇怪。我上传了一个新的闪亮应用程序:(neek05.shinyapps.io/leaflet),名称已更改,但仍然无法正常工作。仅当我将浏览器中的 div 的 id 更改为另一个名称(包括前一个名称:“类别”)时,它才有效。有任何想法吗?谢谢!!
    • @neek05 不!,也许我第一次不够清楚。只要sliderInput-ID 与uiOutput-ID 不同,名称是什么并不重要。你总是给他们起同样的名字。检查我编辑的答案中的完整代码。
    猜你喜欢
    • 2017-08-02
    • 2016-09-11
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多