Проблема с обновлением текста рендеринга из цикла

#r #shiny #shiny-reactivity

#r #блестящий #блестящий-реактивность

Вопрос:

Я пытаюсь выяснить, как заставить rendertext обновляться для каждой итерации в цикле. Я пытаюсь создать строку состояния, в которой некоторый текст выводится для каждого цикла в цикле. В настоящее время текст отображается только после завершения цикла, отображая последнее значение из списка. Панель обновления работает абсолютно нормально.

Есть предложения?

Минимально воспроизводимый вариант можно найти ниже.

 library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  tags$h4(textOutput("loadingtxt")),
  progressBar(id = "pbmod", value = 0, display_pct = TRUE, striped = TRUE)
)

server <- function(input, output, session) {

  observeEvent(session, {

    messages <- data.frame(c("Loading Environment...", "Parsing data...", "Preparing Live Data Feeds...", "Pondering what to display next...", "Calculating Llama Expectoration Trajectory...", "Breeding Fauna...",  "Charging Ozone Layer...", "Compressing Fish Files...", "Speculating Stock Market Indices...", "Application Ready!"), stringsAsFactors = FALSE)


    for (i in 1:10) {
      Sys.sleep(0.7)
      status <- messages[i,]
      status
      output$loadingtxt <- renderText(status)
      updateProgressBar(session = session, id = "pbmod", value = 100/10*i)
    }
  })
}

shinyApp(ui, server)
  

Ответ №1:

Вот вариант.

 library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  tags$h4(textOutput("loadingtxt")),
  progressBar(id = "pbmod", value = 0, display_pct = TRUE, striped = TRUE)
)

server <- function(input, output, session) {

  messages <- data.frame(c("Loading Environment...", "Parsing data...", "Preparing Live Data Feeds...", "Pondering what to display next...", "Calculating Llama Expectoration Trajectory...", "Breeding Fauna...",  "Charging Ozone Layer...", "Compressing Fish Files...", "Speculating Stock Market Indices...", "Application Ready!"), stringsAsFactors = FALSE)

  status <- reactiveVal()
  step <- reactiveVal()

  autoInvalidate <- reactiveTimer(700)

  i <- 0
  observe({
    autoInvalidate()
    i <<- i 1
    if(i == 9){ # stop the reactive timer
      autoInvalidate <<- reactiveTimer(Inf)
    }
    step(i)
    status(messages[i,])
  })

  output$loadingtxt <- renderText({
    updateProgressBar(session = session, id = "pbmod", value = 100/10*step())
    status()
  })
}

shinyApp(ui, server)
  

введите описание изображения здесь