2017-06-13 48 views
0

addCirclemarkers中插入彈出窗口導致需要映射數千個點的數據的冗長計算時間。我假設在顯示地圖之前必須計算所有彈出窗口。r閃亮的傳單 - 按需創建彈出窗口

我在網上搜索了一種方法,只點擊點/圓/標記就可以添加/創建彈出窗口。目前,我在下面的代碼。如果運行此代碼,您將看到彈出窗口已創建,但未從數據中提取字符串。我究竟做錯了什麼?

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)) 

回答

0

有了你的代碼event$idNULL,所以sgh <- pts2[row.names(pts2) == event$id,]線返回NULL爲好。

你必須在layerId添加到CircleMarkers(而沒有必要將其添加到Popup
這也讓訪問它wothout需要對「合併」它與原始數據:

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) 
    }) 
}) 
+0

然後,您可能需要像以前一樣「合併」原始數據('event $ id'現在包含原始數據的'name'值) – GGamba

+0

非常感謝!如果我想要使用更多數據例如,如果數據中會有第三列,比如「type」= c(「great」,「far away」,「popular」),那麼我怎樣才能顯示「這是place 1,它是雷爾好極了「。 –

+0

似乎你在我刪除我之前的評論之前回復了。 ;) –