Я думаю, что использование наблюдателя совсем не неудобно.
Вместо alert()
, вызовите Shiny.setInputValue(id, value);
, и затем на стороне вашего сервера вы можете observeEvent(input[id], { shinyalert() })
.
. Прочитайте эту статью для деталей: https://shiny.rstudio.com/articles/communicating-with-js.html
Для этого вам нужно использовать только один блок кода наблюдения.
Пример
Определить пользовательскую функцию в вашем коде пользовательского интерфейса Javascript и вызвать ее в вашем onclick
. Вы можете поместить эту функцию, скажем, в помощник. js в папке 'www' в папке вашего проекта, которая будет www/helper.js
. Включите этот файл в свой код Shiny UI: tags$head(tags$script(src = "helper.js"))
function showAlert(message, type = "info") {
Shiny.setInputValue(
'alertMessage',
{
message: message,
type: type
},
{ priority: 'event' }
);
}
Затем на стороне сервера Shiny определите наблюдателя один раз
observeEvent(input$alertMessage, {
alertData <- input$alertMessage
req(alertData)
shinyalert("title", alertData$message, type = alertData$type)
})