我的闪亮应用程序有多个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)
答案 0 :(得分:3)
它是可重复的(谢谢!),答案很简单。
问题在于元素的呈现顺序。 (描述可能很混乱,因为你不明确地命名了你的元素。)
说明:您选择的tabPanel
为a
,因为它是第一个可用的标签。因此,您的selectizeInput
a
会被呈现。它使用choices = NULL
按照您的指定进行渲染。
然后两个观察者开火(不是因为他们观察到某些东西,而是因为服务器从上到下运行所有命令,包括所有观察者。)
这导致selectizeInput
a
在d
中更新为您的选择,而 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)
的值作出反应。