Yihui 建议我使用withCallingHandlers
,那确实让我想出了一个解决办法。我不太确定如何以一种完全符合我需要的方式使用该功能,因为我的问题是我有一个功能可以一次打印出多条消息,而使用一种天真的方法只打印最后一条消息。这是我的第一次尝试(如果您只有一条消息要显示,则可行):
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)
})
})
}
))