Обновите блестящий вывод из цикла for в наблюдаемом событии, используя реактивные значения - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь обновить uiOutput, используя изменение в reactiveValues внутри цикла, но, похоже, оно не работает.Я посмотрел на некоторые ответы, но все они пытаются обработать его изнутри вывода $ somthing, что здесь не так: например:

Обновление блестящего вывода в цикле

Для вывода цикла внутри Shiny

Вот несколько воспроизводимых приложений.

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)

Заранее спасибо!

1 Ответ

1 голос
/ 27 сентября 2019

Я переписал ваши серверные коды, чтобы он работал.

Вы не можете обновлять пользовательский интерфейс в цикле, как я уже упоминал в комментарии, это не так, как работает Shiny.Используйте invalidateLater(), чтобы сделать что-то похожее на цикл for.

А также, invalidateLater() не работает в observeEvent, поэтому вам нужно записать логику цикла в observe()

isolate() используется для предотвращения рекурсивного запуска наблюдателя, поэтому он переоценивает только каждые 0,5 секунды на основе invalidateLater(500)

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)})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...