RShiny Leaflet-从测量工具获取数据

The*_*237 3 r leaflet shiny

我正在尝试获取用户在RShiny Leaflet地图上使用度量工具时的结果(特别是区域)。根据传单测量文档,您可以在传单地图上订阅两个名为measurestartmeasurefinish的事件。我需要订阅这些事件并获取事件提供的结果数据,但我不知道如何。

我尝试了多种订阅事件的方法,但没有一种方法被地图触发。

以下是一些看起来最接近工作的代码:

observeEvent(input$map1_measurefinish, {
    print("user finished measurement")
})
Run Code Online (Sandbox Code Playgroud)

要么

observeEvent(input$measurefinish, {
    print("user finished measurement")
})
Run Code Online (Sandbox Code Playgroud)

我的服务器部分中的传单代码如下所示:

output$map1 <-renderLeaflet({
      m<-leaflet() %>%
      addProviderTiles('Esri.WorldImagery') %>%...
# there's more code here but I don't think its relevant for the issue
Run Code Online (Sandbox Code Playgroud)

我需要做什么1.正确订阅事件以检测何时完成测量,以及2.接收输出数据以使用观察者方法进行操作?

编辑:解决方案(由@NicE给出)

为了使代码生效,我对代码进行了更改:

在传单内添加了标记的代码:

output$map1 <-renderLeaflet({
     m<-leaflet() %>%
     addMeasure() %>%
     # Start
     htmlwidgets::onRender("
        function(el, x) {
          var myMap = this;
          myMap.on('measurefinish',
          function (e) {
            Shiny.onInputChange('selectedArea', e.area);
            Shiny.onInputChange('inputtedCoordinates', e.lastCoord);
          })
        }")
     # End
Run Code Online (Sandbox Code Playgroud)

并另外添加了一个观察者(比打印更令人兴奋的事情):

observeEvent(input$selectedArea, {
    print(paste0("area received:", input$selectedArea))
})
Run Code Online (Sandbox Code Playgroud)

Nic*_*icE 5

您可以利用该onRender功能将侦听器添加到插件事件。例如,您可以尝试:

leaflet() %>% addTiles() %>%
      fitBounds(-73.9, 40.75, -73.95,40.8) %>%
      addMeasure() %>%
      htmlwidgets::onRender("
        function(el, x) {
          var myMap = this;
          myMap.on('measurefinish',
            function (e) {
              Shiny.onInputChange('selectedArea', e.area);
            })
        }")
Run Code Online (Sandbox Code Playgroud)

这会在上添加一个侦听器measurefinish,并将传递areaselectedArea闪亮的输入。您可以更改e.area此处提到的任何字段。

这是MWE:

library(leaflet)
library(shiny)


ui <- fluidPage(
  leafletOutput("mymap"),
  br(),
  textOutput("areaText")
)

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

  output$mymap <- renderLeaflet({
    leaflet() %>% addTiles() %>%
      fitBounds(-73.9, 40.75, -73.95,40.8) %>%
      addMeasure() %>%
      htmlwidgets::onRender("
        function(el, x) {
          var myMap = this;
          myMap.on('measurefinish',
            function (e) {
              Shiny.onInputChange('selectedArea', e.area);
            })
        }")
    })

  output$areaText <- renderText({
    paste("Area",input$selectedArea)
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)