javascript - 使用shinyjs通过javascript在 Shiny 的应用程序中操作现有的Leaflet map

标签 javascript r shiny leaflet shinyjs

我有一个 Shiny 的应用程序,其中包含现有的传单 map 。我希望能够在渲染后通过 shinyjs 包使用自定义 JavaScript 来操作该 map 。一个最小的例子如下:

app.R

# packages ----------------------------------------------------------------

library(dplyr)
library(leaflet)
library(shiny)
library(shinyjs)

# ui ----------------------------------------------------------------------

ui <- fluidPage(

  useShinyjs(),
  extendShinyjs(script = "my_js.js"),

  leafletOutput(outputId = "map", height = "80vh"),

  tags$hr(),
  tags$p("Button to run the JS code"),
  actionButton(inputId = "go", label = "Add a Marker")

)

# server ------------------------------------------------------------------

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

  # define a simple map
  output$map <- renderLeaflet({

    leaflet() %>%
      addProviderTiles("CartoDB.Positron")
  })

  # observe the go button and run the shinyjs.addMarker function
  observeEvent(
    eventExpr = input$go,
    handlerExpr = js$addMarker()
  )

}

# run ---------------------------------------------------------------------

shinyApp(ui = ui, server = server)

my_js.js

shinyjs.addMarker = function(){

  // get the map - this bit doesn't work!
  var map = document.getElementById('map');

  // create a marker and add to map
  var marker = new L.marker([53, -1]).addTo(map);

  // really I'd be going off and querying an API, or doing
  // something else for which there is no handy R function.

};

问题实际上是如何在创建 map 对象后访问它。显然,在这个例子中,我只是添加一个标记,我可以使用leafletProxy()来完成,但实际上我想查询一个API,并在用户执行操作时将额外的数据带到 map 上.

任何有关其他方法的帮助或建议将不胜感激!

克里斯

最佳答案

您可以使用 htmlwidtgetonRender() 函数访问 map 对象。然后,您可以将其保存到全局范围的变量(通过在创建变量时跳过 var 关键字)。这在 JavaScript 代码中的任何地方都可用。

output$map <- renderLeaflet({
    leaflet() %>%
        addProviderTiles("CartoDB.Positron") %>%
        htmlwidgets::onRender("
            function(el,x) {
                map = this;
            }
        ")
})

您的 my_js.js 将如下所示:

shinyjs.addMarker = function(){

  // create a marker and add to map
  var marker = new L.marker([53, -1]).addTo(map);

  // really I'd be going off and querying an API, or doing
  // something else for which there is no handy R function.

};

关于javascript - 使用shinyjs通过javascript在 Shiny 的应用程序中操作现有的Leaflet map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50049420/

相关文章:

javascript - react |从保存 URL 的变量导入图像 - 为什么我得到错误的路径?

Javascript onkeypress 删除或点

r - 从 R 中的 smooth.spline 计算曲率

r - 如何避免 Shiny R 图中的闪烁错误?

r - 在 Shiny R 中选择输入

r - downloadHandler在使用R Shiny下载图像时出错

javascript - JS,浏览器化 : function not defined

javascript - jQuery: Firefox focusout 事件

r - 为响应时间数据创建异常值函数

r - 在 R 中使用文件名进行循环