Shiny selectizeInput仅适用于tabPanel 1

时间:2016-03-09 15:26:09

标签: shiny

我的闪亮应用程序有多个tabPanel,我希望每个都有一个selectizeInput。但是,输入仅在第一个面板上显示更新 - 即selectizeInput似乎仅在第一个选项卡上起作用。下面的代码有两个相同的selectizeInputs,它们是更新的。如果这在其他地方不可再现,请道歉,因为它似乎是奇怪的行为。

d <- c('t','u','o')
library(shiny)

ui <- fluidPage(
tabsetPanel(
 tabPanel('a',uiOutput('a')),
 tabPanel('b',uiOutput('b'))
))

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

output$a <- renderUI({
req(d)
selectizeInput(
  'a','test1',choices = NULL,
  options = list(placeholder = 'Please select from below'),
  multiple = TRUE)
})

observe({
req(d)
updateSelectizeInput(session, 
                     'a',choices = d,
                     selected = NULL, server = TRUE)
})

output$b <- renderUI({
req(d)
selectizeInput(
  'b','test2', choices = NULL,
  options = list(placeholder = 'Please select from below'),
  multiple = TRUE)
})

observe({
req(d)
updateSelectizeInput(session, 
                     'b',choices = d,selected = NULL,
                     server = TRUE)
})
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:3)

它是可重复的(谢谢!),答案很简单。

问题在于元素的呈现顺序。 (描述可能很混乱,因为你不明确地命名了你的元素。)

说明:您选择的tabPanela,因为它是第一个可用的标签。因此,您的selectizeInput a会被呈现。它使用choices = NULL按照您的指定进行渲染。

然后两个观察者开火(不是因为他们观察到某些东西,而是因为服务器从上到下运行所有​​命令,包括所有观察者。)

这导致selectizeInput ad 中更新为您的选择,而 selectizeInput b也正在更新中。 注意,此时,selectizeInput b甚至尚未呈现!

因此,当您点击tabPanel b时,第一次呈现selectizeInput b,并按照您的指定,使用{{1}呈现}。 Voilà,没有选择。

解决方案:您希望观察者观察,以便在发生对观察者内容很重要的事情时运行。在这种情况下,这是choices = NULL更改。在下面的代码中,我向tabPanel添加了id,让观察者听到发生的任何事情。

tabsetPanel

注意:有人可能会切断其中一个观察者,剩下的一个会对d <- c('t','u','o') library(shiny) ui <- fluidPage( tabsetPanel(id = "x", tabPanel('a',uiOutput('a')), tabPanel('b',uiOutput('b')) )) server <- function(input, output, session){ output$a <- renderUI({ req(d) selectizeInput( 'a','test1',choices = NULL, options = list(placeholder = 'Please select from below'), multiple = TRUE) }) observe({ req(d) trigger <- input$x updateSelectizeInput(session, 'a',choices = d, selected = NULL, server = TRUE) }) output$b <- renderUI({ req(d) selectizeInput( 'b','test2', choices = NULL, options = list(placeholder = 'Please select from below'), multiple = TRUE) }) observe({ req(d) trigger <- input$x updateSelectizeInput(session, 'b',choices = d,selected = NULL, server = TRUE) }) } shinyApp(ui, server) 的值作出反应。