Добавить виджет широты / долготы на карту Shiny Leaflet - PullRequest
1 голос
/ 11 декабря 2019

Я хочу добавить виджет поиска широты / долготы на карту листовки Shiny. Я нашел работоспособное решение js листовки здесь , и я хотел бы перенести функцию js в мое приложение R Shiny. Используя функцию htmlwidgets onRender с функцией panTo, я могу заставить карту перемещаться по определенным координатам;тем не менее, я хочу, чтобы пользователь мог вводить лат и лонг и увеличивать это местоположение на карте. Вот код для примера карты, которую я использовал для тестирования потенциальных решений. Я потерпел неудачу в моих попытках применить представленные координаты к карте. Закомментированный код в onRender - одна из моих попыток. Будем очень благодарны любой помощи. Спасибо!

            library(shiny)
            library(leaflet)

            ui <- fluidPage(leafletOutput("mymap"),

                            tags$div(
                              HTML(
                                '
                                Latitude: <input type="text" name="lat" id="lat"/>
                                Longitude: <input type="text" name="lng" id="lng"/>
                                <input type="button" onclick="zoomTo()" value="zoomTo"/>
                                '
                              )
                              ))

            server <- function(input, output, session) {
              output$mymap <- renderLeaflet({
                leaflet() %>%
                  addProviderTiles(providers$Stamen.TonerLite,
                                   options = providerTileOptions(noWrap = TRUE)) %>%
                  setView(15, 47, 12) %>%
                  htmlwidgets::onRender(
                    'function(el, x) {                        
                    this.panTo(new L.LatLng(26, -80));                        
                    #var lat = document.getElementById("lat").value;
                    #var lng = document.getElementById("lng").value;
                    #this.panTo(new L.LatLng(lat, lng));


              }'
            )
            })
              }

            shinyApp(ui, server)

1 Ответ

1 голос
/ 12 декабря 2019

Ссылаясь на input$zoomTo в операторе renderLeaflet, Shiny повторно запускает эту функцию, если нажать кнопку. Чтобы это работало, мне нужно было присвоить кнопке id и правильную class.

Я не уверен, почему вы используете HTML и JavaScript, чтобы делать все это вместо использования виджетов, предоставленных Shiny. Взгляните на Shiny Widget Gallery , чтобы увидеть, что возможно, используя только функциональность R.

library(shiny)
library(leaflet)

ui <- fluidPage(leafletOutput("mymap"),

                tags$div(
                    HTML(
                        '
                                Latitude: <input type="text" name="lat" id="lat"/>
                                Longitude: <input type="text" name="lng" id="lng"/>
                                <input id="zoomTo" type="button" value="zoomTo"  class="action-button"/>
                                '
                    )
                ))

server <- function(input, output, session) {
    output$mymap <- renderLeaflet({
        input$zoomTo

        leaflet() %>%
            addProviderTiles(providers$Stamen.TonerLite,
                             options = providerTileOptions(noWrap = TRUE)) %>%
            setView(15, 47, 12) %>%
            htmlwidgets::onRender(
                'function(el, x) {                        
                    var lat = document.getElementById("lat").value;
                    var lng = document.getElementById("lng").value;
                    this.panTo(new L.LatLng(lat, lng));
              }'
            )
    })
}

shinyApp(ui, server)
...