如何在shinyR中创建一个按钮,其事件与传单地图中的多边形绘图工具栏相同

How to create a button in shinyR which event is the same as the polygon drawing toolbar in leaflet map

我想在 shinyR 中创建一个按钮,其事件与传单地图中的多边形绘图工具栏相同。我想弄清楚如何手动触发从 R 到 Leaflet 多边形的事件。基本上,我想如果单击 shinyR 中的一个按钮,我可以开始绘制一个多边形,如果我用传单绘图工具栏这样做的话。

我像这样从 R 向 Javascript 发送指令:

来自UI方:

    drw <- tags$script(HTML(
    "
    Shiny.addCustomMessageHandler(
    'drw_pol',
     const onCreate =(e)=> {
        var e = document.createEvent('Event');
        e.initEvent('click', true, true);
        var cb = document.getElementsByClassName('leaflet-draw-draw-polygon');
        return !cb[0].dispatchEvent(e);
     };
    "
    ))
    
    drw,
    tags$button(type="button", id = "polygon_button", 'handler', style='color:#3399FF ;background-color: Transparent',
              class="btn action-button shiny-bound-input"),
    leafletOutput("map")
    

表单服务器端:

      hit <- function(){
        onClick={(e)= {onCreate(e)}}
      }
      
      observeEvent(input$polygon_button, {
        function(x) {
          session$sendCustomMessage(
            "drw_pol", hit()
          )
        }
      })

不幸的是,我的代码不起作用。我最大的挑战是如何将点击事件从 R 发送到 Shiny。单击事件是通过 R 中的 hit() 函数创建器从 R 发送的。请告诉我我错过了什么?

I come up to a simple solution with the package shinyjs:

in UI:

jspolygon <- "shinyjs.polygon_click = function(){
    var e = document.createEvent('Event');
    e.initEvent('click', true, true);
    var cb = document.getElementsByClassName('leaflet-draw-draw-polygon');
    return !cb[0].dispatchEvent(e);
}"
  useShinyjs(),
  shinyjs::extendShinyjs(text = jspolygon, functions = c("polygon_click"))

in server:

  observeEvent(input$polygon_button, {
    js$polygon_click()
  })