Ошибка обновления рендеринга текста из цикла - PullRequest
0 голосов
/ 28 марта 2019

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

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

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

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 Ответ

1 голос
/ 29 марта 2019

Вот вариант.

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)

enter image description here

...