【问题标题】:r shiny leaflet - creating popups one by one 'on demand'r 闪亮的传单 - “按需”一一创建弹出窗口
【发布时间】:2017-06-13 16:09:49
【问题描述】:

addCirclemarkers 中插入弹出窗口会导致数千个点的映射数据计算时间过长。我假设在显示地图之前必须计算所有弹出窗口。

我在网上搜索了一种仅在单击点/圆/标记时才添加/创建弹出窗口的方法。目前,我在下面的代码。如果您运行此代码,您将看到弹出窗口已创建,但未显示从数据中提取的字符串。我做错了什么?

library(shiny)
library(leaflet)
library(htmltools)
library(sp)

data <- data.frame(
  "name"=c("Place 1","Place 2","Place 3"),
  "lat"=c(50,51,52),
  "lng"=c(3,4,5), stringsAsFactors = FALSE)

ui = fluidPage(
  fluidRow(column(8, offset = 2, leafletOutput("map", width = "100%", height = "650px")))
  )                             

server = function(input, output, session) {

  pts <- reactive({
    pts <- data
    coordinates(pts) <- ~lng+lat
    pts
  })

  output$map <- renderLeaflet({
    leaflet(pts()) %>%
      addTiles(group="OSM") %>%
      addCircleMarkers()
  })

  observeEvent(input$map_marker_click, {
    leafletProxy("map") %>% clearPopups()
    event <- input$map_marker_click
    if (is.null(event))
      return()
    isolate({
      pts2 <- pts()
      sgh <- pts2[row.names(pts2) == event$id,]
      # sgh <- pts2[pts2$name == event$id,]
      content <-  htmlEscape(paste("This place is",as.character(sgh$name)))
      leafletProxy("map") %>% addPopups(event$lng, event$lat, content, layerId = event$id)
    })
  })

}

shinyApp(ui = ui, server = server, options = list(launch.browser=TRUE))

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    你的代码event$idNULL,所以sgh &lt;- pts2[row.names(pts2) == event$id,] 行也返回NULL

    您必须将layerId 添加到CircleMarkers(并且没有必要将其添加到Popup
    这也让无需将其与原始数据“合并”即可访问它:

    output$map <- renderLeaflet({
        leaflet(pts()) %>%
            addTiles(group="OSM") %>%
            addCircleMarkers(layerId = ~name)
    })
    
    observeEvent(input$map_marker_click, {
        leafletProxy("map") %>% 
            clearPopups()
        event <- input$map_marker_click
        if (is.null(event))
            return()
        isolate({
            content <-  htmlEscape(paste("This place is", event$id))
    
            leafletProxy("map") %>% 
                addPopups(event$lng, event$lat, content)
        })
    })
    

    【讨论】:

    • 那么您可能需要像以前那样“合并”到原始数据。 (event$id 现在包含原始数据的name 值)
    • 非常感谢!如果我想在弹出窗口中使用更多数据怎么办,例如如果数据中有第三列,例如“type”= c(“great”、“far away”、“popular”)?然后我怎么能显示“这是地方 1,真的很棒”。?
    • 看来你在我删除我之前的评论之前回复了。 ;)
    • 所以 event$id 总是取原始数据的第一列?
    • 它采用addCircleMarkerslayerId 参数中指定的值
    猜你喜欢
    • 2017-02-27
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多