【问题标题】:How to update reactive output inside a for loop in R shiny如何在 R Shiny 的 for 循环中更新反应输出
【发布时间】:2020-01-24 13:56:18
【问题描述】:

我是 Shiny 的新手,遇到了一个我找不到答案的问题。基本上,我有一个闪亮的应用程序,它在循环中进行一些长时间的计算,我希望它每隔几次迭代输出一个“进度报告”。但是,即使我在循环中重新分配了我的反应变量,输出也不会更新,直到循环(或整个函数?)完成。

这是我的意思的简化测试用例:

library(shiny)

# Basic interface
ui <- fluidPage(
     actionButton("run", "Run"),
     textOutput("textbox")
)

# Basic server with loop
server <- function(input, output) {

  textvals=reactiveValues(a=0)

  observeEvent(input$run, {
    for(i in 1:10){
      textvals$a=i   # Expect output to update here, but doesn't
      Sys.sleep(0.1) # Slight pause so isn't instantaneous
    }
  })

   output$textbox <- renderText({
      textvals$a
   })
}

# Run the application 
shinyApp(ui = ui, server = server)

我希望显示会在循环执行时更新 1、2、3、... 10。相反,它只是直接从 0 跳到 10。如何在循环的中途强制更新?

谢谢。

【问题讨论】:

标签: r shiny reactive


【解决方案1】:

通过使用invalidateLater,您可以获得接近您想要的东西。我认为这不是最短的方法,但它可以帮助您找到更好的解决方案。

library(shiny)

# Basic interface
ui <- fluidPage(
  actionButton("run", "Run"),
  textOutput("textbox")
)

# Basic server with loop
server <- function(input, output, session) {

  textvals <- reactiveVal(0)
  active <- reactiveVal(FALSE)

  output$textbox <- renderText({
   textvals()
  })

  observe({
    invalidateLater(1000, session)
    isolate({
      if (active()) {
        textvals(textvals() + 1)
        if (textvals() > 9) {
          active(FALSE)
        }
      }
    })
  })

  observeEvent(input$run, {
    active(TRUE)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

顺便说一句,反应式循环和 for 循环并不能很好地进行。这可能会有所帮助:https://gist.github.com/bborgesr/e1ce7305f914f9ca762c69509dda632e

【讨论】:

  • 谢谢,我会研究一下这个选项。我浏览了 github 页面,但它的解释非常不透明(至少对于像我这样的新手来说)。
  • 仅供参考,我进行了此更改并且它有效。有人可以向我解释这个的逻辑吗?阅读文档,似乎 invalidateLater() 导致其内部的 observe() 函数在运行 x 毫秒后失效,因此它再次运行。但我不明白为什么需要isolate() 函数,以及为什么在仍调用invalidateLater() 时将active 设置为FALSE 会停止迭代。有人能解释一下发生了什么的编程逻辑吗?
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 2020-04-23
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多