Как создать кнопку в shinyR, событие которой совпадает с панелью инструментов рисования полигонов в карте листовок

#javascript #r #shiny #leaflet.draw

#javascript #r #блестящий #leaflet.draw

Вопрос:

Я хочу создать кнопку в 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()
          )
        }
      })
 

К сожалению, мой код не работает. Моя самая большая проблема заключается в том, как отправить событие click из R в Shiny. событие щелчка отправляется из R через создатель функции hit() в R. Пожалуйста, вы можете сказать мне, что я пропустил?

Ответ №1:

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