Shiny - punkty z mapki

Jak pobrać współrzędne punktu wskazanego na mapie? Czasem istnieje potrzeba, aby w aplikacji (napisanej w Shiny) użytkownik wskazał jakąś lokalizację na mapie. Jak to zrobić? Bardzo szybki wpis, który rozwiązuje konkretny problem. Ot - takie StackOverflow ;). Trzeba narysować mapę - do map interaktywnych bardzo wygodny jest pakiet leaflet, który opakowuje nam bibliotekę Leaflet napisaną w Java Script. Przy okazji: podobnie robi plotly - obie ta biblioteki są proste w użyciu, a dają bardzo atrakcyjne efekty w postaci interaktywnych map czy wykresów. Po narysowaniu mapy ustawiamy marker na jej środku i dostosowujemy widoczny obszar. Pozostaje tylko czekać na event (zdarzenie) z Shiny. Nasza aplikacja zareaguje na zdarzenie w obiekcie mapy. Odpowiednie zmienne zawierają współrzędne klikniętego punktu. Teraz wystarczy usunąć wszystkie dodane markery i na nowo dodać jednej w klikniętym miejscu. Dodatkowo w poniższym kodzie wypisujemy współrzędne klikniętego punktu.

library(shiny)
library(leaflet)

# wygląd aplikacji (najprostszy)
ui <- fluidPage(

   # mapa
   leafletOutput("mymap", height = 400),

   # pole na tekst - tu pokażemy klikane współrzędne
   verbatimTextOutput("coordinates")
)


# mechanika aplikacji
server <- function(input, output) {

   # początkowe ustawienie mapy
   output$mymap <- renderLeaflet(
      leaflet() %>%
         addTiles() %>%
         # środek mapki to domyślny marker
         addMarkers(lng = 19.15, lat = 52.19) %>%
         # mapa pokazuje całą Polskę na początek
         setView(lng = 19.15, lat = 52.19, zoom = 6)
   )

   # czekamy na kliknięcie w mapę
   observeEvent(input$mymap_click, {
      # współrzędne kliknięcia
      click_lat <- input$mymap_click$lat
      click_long <- input$mymap_click$lng

      # na mapie...
      leafletProxy("mymap") %>%
         # czyścimy markery
         clearMarkers() %>%
         # ustawiamy marker w miejscu gdzie kliknięto
         addMarkers(lng = click_long, lat = click_lat)

      # wyświetlamy współrzędne
      output$coordinates <- renderPrint({
         cat(paste0("Long: ", click_long, "\nLat:  ", click_lat))
      })
   })
}

shinyApp(ui = ui, server = server)

Jak działa powyższy kod możecie sprawdzić poniżej (oczywiście klikając po mapie, przesuwając ją i zoomując): Prawda, że proste?