R shinny-同时更新selectInput和progressBar的值
下面的应用程序包含一个R shinny-同时更新selectInput和progressBar的值,r,shiny,shinywidgets,R,Shiny,Shinywidgets,下面的应用程序包含一个操作按钮、一个shinyWidgets::progressBar和一个选择输入: 单击Start按钮时,会触发observeEvent,在该事件中,我循环遍历数字1-10,并在每次迭代时递增进度条。我还想在每次迭代时更新selectInput的值,但updateSelectInput不能按预期工作。循环结束后,selectInput值才会更新,而不是与进度条一起更新。我不明白为什么updateProgressBar可以在这里工作,但是updateSelectInput不能
操作按钮
、一个shinyWidgets::progressBar
和一个选择输入
:
单击Start
按钮时,会触发observeEvent
,在该事件中,我循环遍历数字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)
库(闪亮)
图书馆(shinyWidgets)
ui如果我在removeUI
和insertUI
中设置immediate=T
,它就会工作。我从中得到了这个想法——它并没有解释为什么需要immediate=t
。根据帮助页面:
立即-是否应在安装时立即将UI对象插入应用程序
您可以调用insertUI,或者是否应该等到所有输出都完成后再调用
已更新,并且已运行所有观察者(默认)
但我不明白这在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)
库(闪亮)
图书馆(shinyWidgets)
ui您好,我尝试使用with progress
和incProgress
(请参阅),但它也不起作用。但事实上,我想知道:如果selectInput
停止在字母“j”(因为它是第十个字母)处,为什么您希望它自动更新?这种行为似乎不适用于for循环中的任何updateFoinput
函数(我测试了单选按钮、文本等)。据我所知,唯一的内部区别是调用会话$sendInputMessage()
与调用会话$sendCustomMessage()
。我建议在RStudio社区论坛()上问这个问题,因为这与进度条无关,而与for循环中的sendInputMessage()
行为有关,“这里可能有一些好的建议。”布雷托夫,谢谢你的调查。该应用程序在页面上的不同位置使用多个进度指示器,我更愿意使用with progress
,但它不允许我更改特定进度条的位置。我知道如何使用CSS更改位置,但我必须使用一个类规则.shinny notification{…}
,它将应用于我应用程序中的所有进度指示器。我使用了一个selectInput
作为一个玩具示例。在实际的应用程序中,我正在使用removeUI
和insertUI
更新一些文本,但行为是一样的。谢谢你的建议@Brian。关于sendInputMessage()与sendCustomMessage()的比较,这是一个有趣的观察结果。我的实际应用程序使用insertUI
和removeUI
在进度条下显示一些文本。它们在内部使用会话$sendInsertUI
和会话$onflush
,但行为与更新选择输入
相同。