定期为R闪光输出捕获猫的输出(renderPrint)
希望有人能帮助我。
假设有一个类似于“例子”的函数
##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()
})
是否有某种方法可以定期捕获函数中的“猫”输出到renderPrint? 假设这是一个很长的函数来处理,并且用户获得一些feedbabk会很好。 invalidateLater对于已经在函数中的东西不起作用(至少在我这里试过时似乎是这样的)。
此外,作为第二个问题,以上述方式编写代码会导致renderPrint同时捕获“cat”和data.frame,可能是因为“return”。
如果有人能指出我的方向正确,那将是最有帮助的! 谢谢!
首先,我一直在想这个问题。
由于闪亮是单线程的,捕捉函数输出并根据我所知有光泽地显示它有点棘手。
解决此问题的方法是使用非阻塞文件连接,并在读取函数输出文件时检查后台捕获输出的功能(查看编辑历史记录以了解如何执行此操作)。
这样做的另一种方式是覆盖cat函数写入stderr(简单地用message
切换cat
)并捕获函数输出,如下所示:
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)
})
})
}
))
这个例子主要基于daattali的这个问题。
链接地址: http://www.djcxy.com/p/20955.html上一篇: capturing cat output periodically for R shiny output (renderPrint)
下一篇: It is possible to create this simple shape in Android XML?