繁体   English   中英

使用reactiveValues从observeEvent内部的for循环更新shiny output

[英]Update shiny output from for loop inside observeEvent using reactiveValues

我正在尝试使用循环内部的reactiveValues更改来更新 uiOutput,但它似乎不起作用。 我已经查看了一些答案,但他们都试图从 output$somthing 内部进行处理,这不是这里的情况:就像那些:

在循环内更新 shiny output

对于 Shiny 中 output 内的循环

这里有一些可重现的应用程序。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM