使用reactiveValues更新observeEvent内部for循环的输出

使用reactiveValues更新observeEvent内部for循环的输出,r,shiny,R,Shiny,我试图从循环内部使用reactiveValues中的更改来更新uiOutput,但它似乎不起作用。 我已经研究了一些答案,但他们都试图从内部输出$somthing进行处理,这里不是这样的: 例如: 这里有一些可复制的应用程序 vars = reactiveValues(cc="",ct=0) ui = fluidRow(uiOutput("warngt"),actionButton("searchgt","Search")) server = function(input, output,

我试图从循环内部使用
reactiveValues
中的更改来更新uiOutput,但它似乎不起作用。 我已经研究了一些答案,但他们都试图从内部输出$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)
vars=reactiveValues(cc=”“,ct=0)
ui=fluidRow(uiOutput(“warngt”)、actionButton(“searchgt”、“Search”))
服务器=功能(输入、输出、会话){
observeEvent(输入$searchgt{

如果(vars$ct我重写了你的服务器代码,使其正常工作

正如我在评论中已经提到的,不能在循环中更新UI,这不是闪亮的工作方式。请使用
invalidateLater()
执行类似于for循环的操作

而且,
invalidaterater()
observeEvent
中不起作用,因此需要在
observeEvent()
中编写循环逻辑

isolate()
用于防止观察者的递归触发,因此它仅根据
invalidaterater(500)

server=功能(输入、输出、会话){
变量=反应值(cc=”“,ct=0)

startSearch您对shiny如何工作的理解是不正确的。您无法在循环中更新UI,因为所有渲染/观察者仅在前一个观察者执行后执行。
重复
循环不起作用,因为该
观察事件
始终占用会话。您需要改用
无效化器
以下资源可以帮助您解决问题: