[英]Update shiny output from for loop inside observeEvent using reactiveValues
我正在尝试使用循环内部的reactiveValues
更改来更新 uiOutput,但它似乎不起作用。 我已经查看了一些答案,但他们都试图从 output$somthing 内部进行处理,这不是这里的情况:就像那些:
这里有一些可重现的应用程序。
vars = reactiveValues(cc="",ct=0)
ui = fluidRow(uiOutput("warngt"),actionButton("searchgt","Search"))
server = function(input, output, session){
observeEvent(input$searchgt,{
if(vars$ct<10){
repeat{
vars$ct=vars$ct+1
vars$cc=paste(sprintf('<b style="color:blue">',"Searching...[%s]",vars$ct),"</b>");Sys.sleep(.5)
#This also does not work:
#output$warngt=renderUI({HTML(vars$cc)})
vars$busca = try(print("Something"),silent = T)
if(vars$ct==10){break}
}
}else{
#This work just fine
vars$cc=paste('<b style="color:red">',"Some warning.","</b>")
}
#This also doesn't work
#output$warngt=renderUI({HTML(vars$cc)})
})
output$warngt = renderUI({HTML(vars$cc)})
}
shinyApp(ui = ui, server = server)
提前致谢!
我重写了您的服务器代码以使其正常工作。
正如我在评论中已经提到的,您不能循环更新 UI,这不是 Shiny 的工作方式。 使用invalidateLater()
执行类似于 for 循环的操作。
而且, invalidateLater()
在observeEvent
中不起作用,所以你需要在observe()
中编写循环逻辑
isolate()
用于防止观察者的递归触发,因此它仅基于invalidateLater(500)
每 0.5 秒重新评估一次
server = function(input, output, session){
vars = reactiveValues(cc="",ct=0)
startSearch <- reactiveVal(FALSE)
startSearch <- eventReactive(input$searchgt,{
TRUE
})
observe({
req(startSearch())
if (isolate(vars$ct) < 10){
invalidateLater(500)
isolate({
vars$ct=vars$ct+1
vars$cc=paste('<b style="color:blue">',"Searching...",vars$ct,"</b>")
vars$busca = try(print("Something"),silent = T)
})
} else {
vars$cc=paste('<b style="color:red">',"Some warning.","</b>")
}
})
output$warngt = renderUI({HTML(vars$cc)})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.