【问题标题】:Shiny: Is it possible to have reactive code running alongside observeEvent()?Shiny:是否可以让响应式代码与 observeEvent() 一起运行?
【发布时间】:2018-10-08 13:41:48
【问题描述】:

在下面的 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 的作者正在研究“异步”和“承诺”来解决这些问题。我认为future 包已经有可能的解决方法
  • 我想了很多......我可能可以修改我的包,将我需要的计算分成几个单独的函数调用。这不是我需要打印 IRL 的时钟,它是一个逐步更新的日志文件。
  • 实际上,自从我上次检查以来,promises 已经达到了1.0(尽管仍然需要来自 Github 的 Shiny 开发版)。我试图整理出你的问题的答案,但还没有成功。参考:rstudio.github.io/promises

标签: r shiny shiny-reactivity shinyapps


【解决方案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

【讨论】:

  • 伟大的 Auréle,谢谢。我肯定会有戏。不幸的是,我的客户不会热衷于使用 CRAN 之外不是我构建的任何东西。我正在研究替代解决方法......并且祈祷 CRAN Shiny 很快就会更新!
猜你喜欢
  • 2018-11-18
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多