Это работает, если я установлю 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)