Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R shinny-同时更新selectInput和progressBar的值_R_Shiny_Shinywidgets - Fatal编程技术网

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
,但行为与
更新选择输入
相同。