如何在R中更新for循环内的无功输出

如何在R中更新for循环内的无功输出,r,shiny,reactive,R,Shiny,Reactive,我对Shiny是新手,遇到了一个我找不到答案的问题。基本上,我有一个闪亮的应用程序,它在循环中进行一些长时间的计算,我希望它每隔几次迭代就输出一个“进度报告”。但是,即使我在循环中重新分配了被动变量,输出也不会更新,直到循环(或整个函数?)完成 下面是一个简化的测试用例,我的意思是: library(shiny) # Basic interface ui <- fluidPage( actionButton("run", "Run"), textOutput("tex

我对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)
库(闪亮)
#基本接口

ui使用
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)
库(闪亮)
#基本接口

ui是否有帮助:?可能重复感谢,我将研究此选项。我浏览了github页面,但是它的解释非常模糊(至少对于像我这样的新手来说是如此)。有人能给我解释一下这个逻辑吗?在阅读文档时,invalidateLater()似乎会导致其内部的observe()函数在运行x毫秒后失效,因此它会再次运行。但我不明白为什么必须使用isolate()函数,为什么在仍然调用invalidateLater()时,将active设置为FALSE会停止迭代。有人能解释一下编程逻辑吗?