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)
})
})
}
))
person
DeanAttali
schedule
27.05.2015
withCallingHandlers()
, за да улавяте съобщения в R израз, след което да ги отпечатвате/катирате. - person Yihui Xie   schedule 27.05.2015