是否可以让反应式代码与observeEvent()一起运行?

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

在下面的 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)
r shiny shiny-reactivity
1个回答
1
投票

这个答案还不起作用,我把它放在这里只是为了让你可以跟着我接。

您需要更新到 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)

我预计它会起作用,但“昂贵的操作”仍然阻塞,我还没弄清楚为什么。希望它仍然有用。

参考:https://rstudio.github.io/promises

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