我使用 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 中进行更改)?
不幸的是,我不知道如何使用反应性的正常闪亮方法来做到这一点。我尝试让它与
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)
})
})
}
))
遇到这个答案,这可能就是您正在寻找的。
withConsoleRedirect()
函数将控制台输出发送到浏览器。