将控制台输出作为状态更新反应式传递给 Shiny

问题描述 投票:0回答:2

我使用 R 和 Shiny 创建了一个应用程序,并希望将控制台中发生的所有内容输出到 Shiny 应用程序中的特殊状态窗口。 这是 Shiny 应用程序调用的函数的框架如下。

myfunction = function(x,y,path....){
if(...){...}
cat("Reading Database\n")
df = read.csv(...)
cat("Processing\n")
#MORE CODE
}

我想要一个状态栏,通过查看

cat(...)
控制台输出来显示被调用函数的进度。 如果是,是否可以在不对原始功能进行任何更改的情况下完成(仅在 server.R 和/或 ui.R 中进行更改)?

r console shiny
2个回答
1
投票

不幸的是,我不知道如何使用反应性的正常闪亮方法来做到这一点。我尝试让它与

textOuput
+
printText
一起工作,但我做不到。我很想看到其他解决方案,但这是我的解决方案,它使用 shinyjs 包来更新元素而不是使用反应性。我希望这对你有用,它非常简单。

library(shiny)
library(shinyjs)

calculate <- function() {
  lapply(1:5, function(x) {
    message(x)
    Sys.sleep(0.5)
  })
  message("Done")
}

runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(), br(),
    actionButton("btn","Click me"), br(), br(),
    "Progress:",
    tags$pre(id = "progress")
  ),
  server = function(input,output, session) {
    observeEvent(input$btn, {
      withCallingHandlers({
        shinyjs::text("progress", "")
        calculate()
      },
      message = function(m) {
        shinyjs::text(id = "progress", text = m$message, add = TRUE)
      })
    })
  }
))

0
投票

遇到这个答案,这可能就是您正在寻找的。

withConsoleRedirect()
函数将控制台输出发送到浏览器。

© www.soinside.com 2019 - 2024. All rights reserved.