Я разрабатываю блестящее приложение, которое вводит пользовательский ввод, создает новое значение с этого ввода на стороне сервера и затем отправляет это значение для использования в каком-то пользовательском javascript-коде. Понятно, что для отправки сообщений от блестящих к javascript мне нужно использовать функцию session$sendCustomMessage()
рядом с Shiny.addCustomMessageHandler()
на стороне javascript. Пример приложения может выглядеть так:
library(shiny)
ui <- fluidPage(
HTML(
'<p id="insertion_target"></p>
<script>
Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
alert(message_from_r);
});
var insertion_text = "banana";
document.getElementById("insertion_target").innerHTML = insertion_text;
</script>'
),
textInput("text", "Text", "Some_text"),
actionButton("btn", "Send message")
)
server <- function(input, output, session) {
observeEvent(input$btn, {
modified_text <- paste(input$text, "_modified")
session$sendCustomMessage("modified_text", modified_text)
})
}
shinyApp(ui, server)
Поэтому я получаю предупреждение с измененным текстом и абзацем, который может быть нацелен на переменную javascript. Теперь я хочу сохранить это сообщение в глобальной переменной для использования в более позднем скрипте. В этом случае, заменив "banana" на message_from_r на внешнюю функцию javascript. Я бы предположил, что это должно работать:
library(shiny)
ui <- fluidPage(
HTML(
'<p id="insertion_target"></p>
<script>
Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
alert(message_from_r);
var insertion_text = message_from_r
});
document.getElementById("insertion_target").innerHTML = insertion_text;
</script>'
),
textInput("text", "Text", "Some_text"),
actionButton("btn", "Send message")
)
server <- function(input, output, session) {
observeEvent(input$btn, {
modified_text <- paste(input$text, "_modified")
session$sendCustomMessage("modified_text", modified_text)
})
}
shinyApp(ui, server)
Или, альтернативно:
library(shiny)
ui <- fluidPage(
HTML(
'<p id="insertion_target"></p>
<script>
var insertion_text = Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
alert(message_from_r);
return message_from_r;
});
document.getElementById("insertion_target").innerHTML = insertion_text;
</script>'
),
textInput("text", "Text", "Some_text"),
actionButton("btn", "Send message")
)
server <- function(input, output, session) {
observeEvent(input$btn, {
modified_text <- paste(input$text, "_modified")
session$sendCustomMessage("modified_text", modified_text)
})
}
shinyApp(ui, server)
Я сейчас смотрел на это некоторое время и пришел к выводу, что мой javascript плох. Пожалуйста помоги!
Определите insertion_text
вне обработчика сообщений. Таким образом, это глобальная переменная.
И вы можете вызвать пользовательское событие в body
при отправке сообщения:
<script>
var insertion_text = null;
Shiny.addCustomMessageHandler("modified_text", function(message_from_r) {
alert(message_from_r);
insertion_text = message_from_r;
$("body").trigger("myCustomEvent");
});
$("body").on("myCustomEvent", function(){
document.getElementById("insertion_target").innerHTML = insertion_text;
})
</script>
insertion_text
не перезаписываются во времяShiny.addCustomMessageHandler
вызова функции. Несмотря на то, что предупреждение возвращается корректным,insertion_text
не изменяется глобально.if
внутри обработчика сообщений? На самом деле, я не знал, почему вы положили это на улицу, и мне было интересно.