R Shiny dynamic multilevel/nested 带有 renderUI 的 tabPanel
R Shiny dynamic multilevel/nested tabPanel with renderUI
我想在另一个 tabsetPanel 中创建一个 tabsetPanel。
第二个tabsetPanel的tab数量应该取决于一级tab中的一个selectizeInput。
这个最小的例子看起来几乎没问题。但是,当在输入框中选择二级选项卡时,创建的选项卡立即消失。
挑战在于如何获取lapply函数中selectizeInput的输出。
library(shiny)
ui <- fluidPage(mainPanel(
selectizeInput(
inputId = "letters",
label = "Select letters for level 1 tabs",
choices = LETTERS,
selected = c('A', 'B', 'C'),
multiple = TRUE
),
uiOutput('mytabs')
))
server <- function(input, output) {
output$mytabs <- renderUI({
level1Tabs <- lapply(1:length(input$letters),
function(i) {
tabPanel(input$letters[i],
test2 <- renderUI({
selectizeInput(
inputId = 'numbers',
label = 'Select numbers for level 2 tabs',
choices = 1:10,
multiple = TRUE
)
}),
do.call(tabsetPanel,
lapply(1:length(input$numbers), function(j) {
tabPanel(input$numbers[j],
h5('test'))
})))
})
do.call(tabsetPanel, level1Tabs)
})
}
# Run the application
shinyApp(ui = ui, server = server)
答案很简单:只需将内部级别的 tabsetPanel 放入 renderUI
renderUI({
do.call(tabsetPanel,
lapply(1:length(input$numbers), function(j) {
tabPanel(input$numbers[j],
h5('test'))
}))
})
这将阻止updating/refresing selectizeInput (numbers)
我想在另一个 tabsetPanel 中创建一个 tabsetPanel。 第二个tabsetPanel的tab数量应该取决于一级tab中的一个selectizeInput。
这个最小的例子看起来几乎没问题。但是,当在输入框中选择二级选项卡时,创建的选项卡立即消失。
挑战在于如何获取lapply函数中selectizeInput的输出。
library(shiny)
ui <- fluidPage(mainPanel(
selectizeInput(
inputId = "letters",
label = "Select letters for level 1 tabs",
choices = LETTERS,
selected = c('A', 'B', 'C'),
multiple = TRUE
),
uiOutput('mytabs')
))
server <- function(input, output) {
output$mytabs <- renderUI({
level1Tabs <- lapply(1:length(input$letters),
function(i) {
tabPanel(input$letters[i],
test2 <- renderUI({
selectizeInput(
inputId = 'numbers',
label = 'Select numbers for level 2 tabs',
choices = 1:10,
multiple = TRUE
)
}),
do.call(tabsetPanel,
lapply(1:length(input$numbers), function(j) {
tabPanel(input$numbers[j],
h5('test'))
})))
})
do.call(tabsetPanel, level1Tabs)
})
}
# Run the application
shinyApp(ui = ui, server = server)
答案很简单:只需将内部级别的 tabsetPanel 放入 renderUI
renderUI({
do.call(tabsetPanel,
lapply(1:length(input$numbers), function(j) {
tabPanel(input$numbers[j],
h5('test'))
}))
})
这将阻止updating/refresing selectizeInput (numbers)