Как обновить реактивный вывод внутри цикла for в R Shiny - PullRequest
2 голосов
/ 24 сентября 2019

Я новичок в Shiny и столкнулся с проблемой, на которую не могу найти ответ.По сути, у меня есть приложение Shiny, которое выполняет несколько длительных вычислений в цикле, и я хочу, чтобы оно выводило «отчет о ходе работы» каждые несколько итераций.Однако, даже если я переназначаю свою реактивную переменную в цикле, выходные данные не обновляются, пока цикл (или вся функция?) Не завершится.

Вот упрощенный тестовый пример того, что я имею в виду:

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)

Я ожидал бы, что дисплей будет обновлять 1, 2, 3, ... 10 по мере выполнения цикла.Вместо этого он просто переходит прямо с 0 на 10. Как я могу принудительно выполнить обновление в цикле?

Спасибо.

1 Ответ

0 голосов
/ 24 сентября 2019

С помощью 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)

Кстати, реактивные циклы и петли не очень хорошо ладят.Это может помочь: https://gist.github.com/bborgesr/e1ce7305f914f9ca762c69509dda632e

...