Yihui は私が を使用することを提案withCallingHandlers
しました。私の問題は、一度に複数のメッセージを1つずつ出力する関数があり、素朴なアプローチを使用すると最後のメッセージしか出力されなかったため、必要なことを正確に実行する方法でその関数を使用する方法がよくわかりませんでした。これが私の最初の試みです(表示するメッセージが1つしかない場合に機能します):
foo <- function() {
message("one")
message("two")
}
runApp(shinyApp(
ui = fluidPage(
actionButton("btn","Click me"),
textOutput("text")
),
server = function(input,output, session) {
observeEvent(input$btn, {
withCallingHandlers(
foo(),
message = function(m) output$text <- renderPrint(m$message)
)
})
}
))
two\n
出力のみが取得されることに注意してください。したがって、私の最終的な解決策は、パッケージのhtml
関数を使用することでしたshinyjs
(免責事項: 私はそのパッケージを作成しました)。これにより、要素内の HTML を変更または追加できます。それは完全に機能しました - 両方のメッセージがリアルタイムで印刷されました.
foo <- function() {
message("one")
Sys.sleep(0.5)
message("two")
}
runApp(shinyApp(
ui = fluidPage(
shinyjs::useShinyjs(),
actionButton("btn","Click me"),
textOutput("text")
),
server = function(input,output, session) {
observeEvent(input$btn, {
withCallingHandlers({
shinyjs::html("text", "")
foo()
},
message = function(m) {
shinyjs::html(id = "text", html = m$message, add = TRUE)
})
})
}
))