一辉建议我使用withCallingHandlers
,这确实让我找到了一个解决方案.我不太确定如何使用该函数来实现我所需要的功能,因为我的问题是,我有一个函数,它一次打印出几条消息,而使用一种简单的方法,只打印最后一条消息.以下是我的第一次try (如果您只有一条消息要显示,那么这一try 就有效):
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
个被输出.因此,我的最终解决方案是使用shinyjs
包中的html
函数(免责声明:我编写了该包),它允许我更改或附加到元素中的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)
})
})
}
))