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