R 是否可以在闪亮的ui中显示控制台消息(用“message”编写)?

R 是否可以在闪亮的ui中显示控制台消息(用“message”编写)?,r,shiny,shinyjs,R,Shiny,Shinyjs,我不太理解R的消息、猫、打印等等,但我想知道是否有可能捕获消息并在一个闪亮的应用程序中显示它们 示例:以下应用程序可以捕获cat语句(也可以打印语句),但不能捕获消息语句 runApp(shinyApp( ui = fluidPage( textOutput("test") ), server = function(input,output, session) { output$test <- renderPrint({ cat("test cat"

我不太理解R的消息、猫、打印等等,但我想知道是否有可能捕获消息并在一个闪亮的应用程序中显示它们

示例:以下应用程序可以捕获cat语句(也可以打印语句),但不能捕获消息语句

runApp(shinyApp(
  ui = fluidPage(
    textOutput("test")
  ),
  server = function(input,output, session) {
    output$test <- renderPrint({
      cat("test cat")
      message("test message")
    })
  }
))
runApp(shinyApp)(
ui=fluidPage(
文本输出(“测试”)
),
服务器=功能(输入、输出、会话){

output$testYihui建议我使用
和callinghandlers
,这确实让我找到了一个解决方案。我不太确定如何使用该函数来实现我所需要的功能,因为我的问题是,我有一个函数一次打印多条消息,而使用简单的方法只能打印最后一条消息。以下是我的第一次尝试(如果您只有一条消息要显示,则此尝试有效):


我知道这并没有那么优雅,但我使用
capture.output
解决了一个有点类似的问题;遗憾的是
sink
不允许同时捕获消息和输出。您不能按原始顺序获取它们,但至少可以提取两个流(这里转到HTML):


也许在这种情况下,如果用户想要捕获两者,但同时也要分离它们,这将提供一个方便的解决方法。(您的
shinyjs
包看起来很整洁,需要看看!)

我想您可以使用
和callinghandlers()一起使用)
捕获R表达式中的消息,然后打印/编辑它们。谢谢Yihui,我能够使用它,这是一个巨大的帮助。这种方法的问题是,所有的输出都会在最后打印出来,它不会实时出现。因此,如果您运行一个缓慢的函数,在运行时打印输出,您将无法看到它,直到它完成为止。我向您致敬,先生。Th非常感谢。我有一个函数可以打印message()文本。使用您的解决方案,我可以使用html标记编辑
shinyjs::html(id=“text”,html…
行。要在每条消息后添加换行符,您可以调整为
shinyjs::html(id=“text”,html=paste0(m$message,
),add=TRUE)
@DeanAttali,是否可以将
cat
print
实时捕获到用户界面?如果有人的函数使用cat或print,
调用处理程序
tryCatch
不起作用。这似乎只适用于
观察事件
。我是否缺少一些可以处理
eventReactive
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)
      )
    })
  }
))
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)
      })
    })
  }
))
runApp(shinyApp(
  ui = fluidPage(
    uiOutput("test")
  ),
  server = function(input,output, session) {
    output$test <- renderUI({
      HTML(
      paste(capture.output(type = "message", expr = { 
        message(capture.output(type = "output", expr = {
          cat("test cat<br>")
          message("test message")
          cat("test cat2<br>")
          message("test message2")
        }))
      }), collapse="<br>")
  )})
 })
)
test message
test message2
test cat
test cat2