定期捕获 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(只需将 cat
与 message
切换)并捕获函数输出,如下所示:
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 时找不到错误对象输出
可以在闪亮的 ui 中显示控制台消息(用 `message` 编写)?