定期为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?