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

问题描述

我想在 ShinyR 中创建一个按钮,它的事件与传单地图中的多边形绘制工具栏相同。我想弄清楚如何手动触发从 R 到传单多边形的事件。基本上,我希望如果单击 ShinyR 中的一个按钮,我可以使用传单绘图工具栏以相同的方式开始绘制多边形。

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

用户界面方面:

    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()
  })