定期捕获 cat 输出以获取 R 闪亮输出 (renderPrint)

Posted

技术标签:

【中文标题】定期捕获 cat 输出以获取 R 闪亮输出 (renderPrint)【英文标题】:capturing cat output periodically for R shiny output (renderPrint) 【发布时间】:2014-07-31 01:05:59 【问题描述】:

希望有人可以帮助我。

假设有一个函数“示例”,类似于

##function from a package

example<-function(f)
         #does something
         cat("step 1 done....")
         # etc etc
         cat("step 2 done....")
         return(some_data_frame)


##server ui code
example2<-reactive(
         if(input$some_action_button==0)
           return()
         result<-isolate(example(input$f1))
         return(result)
)

output$f2<-renderPrint(
         example2()
)

有没有办法定期将函数的“cat”输出捕获到 renderPrint 中?假设这是一个很长的处理函数,并且用户得到一些反馈会很好。 invalidateLater 不适用于函数中已经存在的内容(至少当我在这里尝试时看起来是这样)。

另外,作为次要问题,以上述方式编写代码会导致renderPrint同时捕获“cat”和data.frame,可能是因为“return”。

如果有人能指出我正确的方向,那将是最有帮助的!谢谢!

【问题讨论】:

【参考方案1】:

首先,这是一个很好的问题,我一直在思考这个问题。

由于闪亮是单线程的,因此捕获函数输出并根据我所知道的闪亮显示它有点棘手。

解决此问题的方法是使用非阻塞文件连接并运行要在后台捕获输出的函数,同时读取函数输出的文件(检查编辑历史以了解如何执行此操作) .

另一种方法是覆盖 cat 函数以写入 stderr(只需将 catmessage 切换)并捕获函数输出,如下所示:

library(shiny)
library(shinyjs)

myPeriodicFunction <- function()
  for(i in 1:5)
    msg <- paste(sprintf("Step %d done.... \n",i))
    cat(msg)
    Sys.sleep(1)
  


# Override cat function
cat <- message

runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    actionButton("btn","Click me"),
    textOutput("text")
  ),
  server = function(input,output, session) 
    observeEvent(input$btn, 
      withCallingHandlers(
        shinyjs::text("text", "")
        myPeriodicFunction()
      ,
      message = function(m) 
        shinyjs::text(id = "text", text = m$message, add = FALSE)
      )
    )
  
))

这个例子主要是基于this daattali 的问题。

【讨论】:

不错;但将 shinyjs::text 替换为 shinyjs::html 并将 text 参数替换为 html = m$message

以上是关于定期捕获 cat 输出以获取 R 闪亮输出 (renderPrint)的主要内容,如果未能解决你的问题,请参考以下文章

适合先知输出到闪亮窗口的图形的宽度

尝试从 R 脚本渲染闪亮的 flexdashboard 时找不到错误对象输出

为 DT 输出渲染文本输入时出现 R 闪亮错误

可以在闪亮的 ui 中显示控制台消息(用 `message` 编写)?

R Shiny 不会在闪亮的应用程序中显示输出,而只会在控制台中显示输出(以及如何正确计算子组的平均值)?

捕获和处理来自 R 的外部命令的输出