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