2016-12-12 1 views
4

Что я хочу сделать, это довольно просто. Я хочу сохранить все события кликов на карте Shiny/Leaflet. Вот пример кода:Как «сохранить» события кликов в Листочке Блестящая карта

library(raster) 
library(shiny) 
library(leaflet) 

#load shapefile 
rwa <- getData("GADM", country = "RWA", level = 1) 

shinyApp(
    ui = fluidPage(
    leafletOutput("map") 
), 

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

    #initial map output 
    output$map <- renderLeaflet({ 
     leaflet() %>% 
     addTiles() %>% 
     addPolygons(data = rwa, 
        fillColor = "white", 
        fillOpacity = 1, 
        color = "black", 
        stroke = T, 
        weight = 1, 
        layerId = [email protected]$OBJECTID, 
        group = "regions") 
    }) #END RENDER LEAFLET 

    observeEvent(input$map_shape_click, { 

     #create object for clicked polygon 
     click <- input$map_shape_click 

     print(click$id) 

    }) #END OBSERVE EVENT 
    }) #END SHINYAPP 

enter image description here

Как вы можете видеть, я могу напечатать клик идентификаторами (или все события щелчка) при нажатии на многоугольник. Достаточно легко. Однако в тот момент, когда я нажимаю другой полигон, вся информация о моем первом щелкнутом многоугольнике теряется. Я вижу, что есть аргумент autoDestroy = F в observeEvent, но я не уверен, как использовать его для сохранения ранее щелкнутых полигонов. Есть ли способ сохранить все мои клики/щелкнуть $ ids в векторе или списке?

ответ

5

Вы можете сделать это, используя reactiveValues, чтобы сохранить клики.

справа в верхней части вашей функции сервера добавить

RV<-reactiveValues(Clicks=list()) 

, а затем измените observeEvent на:

observeEvent(input$map_shape_click, { 

     #create object for clicked polygon 
     click <- input$map_shape_click 
     RV$Clicks<-c(RV$Clicks,click$id) 
     print(RV$Clicks) 

}) #END OBSERVE EVENT 

Что происходит каждый раз, когда вы нажимаете, то id добавляется к list из клики, хранящиеся в RV$Clicks. Это не должно быть list, вы можете сделать это vector, если это вам лучше.

+0

Спасибо, это трюк! Я получил возможность наблюдать за событиями, но пока не могу понять, как реагировать. Все еще довольно новый для Shiny. – Lauren

+1

@ Lauren Стоит отметить, что 'reactiveValues' отличаются от' реактивных() 'функций. Оба они очень полезны сами по себе. – SymbolixAU

+0

@John Paul, @SymbolixAU, если я изменю свой «наблюдательный элемент», чтобы просто «наблюдать», мой элемент с первым щелчком повторяется (по-видимому) бесконечно. Любое понимание того, почему это происходит/как его исправить? Или я должен задать другой вопрос? – Lauren