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)

感谢期待,

克里斯

4

1 回答 1

1

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

您需要更新到 Shiny ( remotes::install_github("rstudio/shiny")) 的开发版本。

我用 a 替换了您的玩具示例,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

于 2018-04-27T18:46:51.243 回答