R Shiny - Обновление значения selectInput и progressBar одновременно - PullRequest
1 голос
/ 18 января 2020

Приложение ниже содержит actionButton, shinyWidgets::progressBar и selectInput:

enter image description here

Когда кнопка Start при щелчке запускается observeEvent, в котором I l oop через номера 1-10 и увеличивает индикатор выполнения на каждой итерации. Я также хотел бы обновлять значение selectInput на каждой итерации, но updateSelectInput не работает должным образом. Вместо обновления в тандеме с индикатором выполнения значение selectInput обновляется только после прекращения действия l oop. Я не понимаю, почему updateProgressBar здесь работает, а updateSelectInput нет?

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  actionButton(inputId = "go", label = "Start"), #, onclick = "$('#my-modal').modal().focus();"
  shinyWidgets::progressBar(id = "pb", value = 0, display_pct = TRUE),
  selectInput('letters', 'choose', letters)
)

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

  observeEvent(input$go, {

    shinyWidgets::updateProgressBar(session = session, id = "pb", value = 0) # reinitialize to 0 if you run the calculation several times

    for (i in 1:10) {

      updateProgressBar(session = session, id = "pb", value = 100/10*i)

      updateSelectInput(session, 'letters', selected = letters[i])

      Sys.sleep(.5)

    }

  })

}

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 19 января 2020

Это работает, если я установлю immediate = T в removeUI и insertUI. Я получил идею из этого поста - он не объясняет, зачем нужен immediate = T. Согласно странице справки:

Немедленно - должен ли объект UI быть немедленно вставлен в приложение при вызове insertUI, или Shiny должен дождаться обновления всех выходов и запуска всех наблюдателей (по умолчанию).

Но я не понимаю, что это значит в контексте for-l oop. Имеет ли это какое-то отношение к объему for-l oop?

Если кто-то может опубликовать объяснение здесь, я приму его ответ.

Обновленный код:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  actionButton(inputId = "go", label = "Start"), #, onclick = "$('#my-modal').modal().focus();"
  shinyWidgets::progressBar(id = "pb", value = 0, display_pct = TRUE),
  div(id = 'placeholder')
)

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

  observeEvent(input$go, {

    shinyWidgets::updateProgressBar(session = session, id = "pb", value = 0) # reinitialize to 0 if you run the calculation several times

    for (i in 1:10) {

      updateProgressBar(session = session, id = "pb", value = 100/10*i)

      removeUI('#text', immediate = T)

      insertUI('#placeholder', ui = tags$p(id = 'text', paste('iteration:', i)), immediate = T)

      Sys.sleep(1)

    }

  })

}

shinyApp(ui = ui, server = server)
...