2

下面的应用程序包含一个actionButton、一个shinyWidgets::progressBar和一个selectInput

在此处输入图像描述

Start单击按钮时,observeEvent会触发 an ,其中我循环遍历数字 1-10 并在每次迭代时递增进度条。我还想selectInput在每次迭代时更新值,但 updateSelectInput 不能按预期工作。selectInput该值仅在循环终止后才更新,而不是与进度条同步更新。我不明白为什么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)
4

1 回答 1

1

如果我设置immediate = T和. 我从这篇文章中得到了这个想法——虽然它没有解释为什么需要。根据帮助页面:removeUIinsertUIimmediate = T

立即 - 当您调用 insertUI 时是否应立即将 UI 对象插入应用程序,或者 Shiny 是否应等到所有输出都已更新并且所有观察者都已运行(默认)。

但我不明白这在 for 循环的上下文中意味着什么。它与for循环的范围有关吗?

如果有人可以在这里发表解释,我会接受他们的回答。

更新代码:

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)
于 2020-01-19T10:31:22.783 回答