在下面的 Shiny 应用程序中,按下操作按钮(运行)时会执行长计算。输出显示在计算结束时。
应用程序中显示时钟。当长时间计算正在进行时,时钟不会更新。
是否可以在计算过程中更新时钟?
代码:
library(shiny)
n <- c(1:42E7)
ui <- fluidPage(
actionButton(inputId = "run", label = "Run a long calculation"),
verbatimTextOutput("calc"),
verbatimTextOutput("time")
)
server <- function(input, output) {
x <- observeEvent(input$run,{
output$calc <- renderText({
head(sqrt(n))
})
})
output$time <- renderText({
invalidateLater(1000)
print(as.character(Sys.time()))
})
}
shinyApp(ui = ui, server = server)
这个答案还不起作用,我把它放在这里只是为了让你可以跟着我接。
您需要更新到 Shiny 的开发版本 (
remotes::install_github("rstudio/shiny")
)。
我用
Sys.sleep()
替换了你的玩具示例,因为传输提高选项 future.globals.maxSize
所需的大向量,并且仍然导致我的机器崩溃。
library(shiny)
library(promises)
library(future)
plan(multiprocess)
ui <- fluidPage(
actionButton(inputId = "run",
label = "Run a long calculation"),
verbatimTextOutput("calc"),
verbatimTextOutput("time")
)
server <- function(input, output, session) {
observeEvent(input$run,{
output$calc <- renderText({
future({
Sys.sleep(5)
42
}) %...>%
head() %...>%
print()
})
})
output$time <- renderPrint({
invalidateLater(1000)
as.character(Sys.time())
})
}
shinyApp(ui = ui, server = server)
我预计它会起作用,但“昂贵的操作”仍然阻塞,我还没弄清楚为什么。希望它仍然有用。