R Блестящая динамическая многоуровневая / вложенная панель вкладок с renderUI

Я хочу создать tabsetPanel в другом tabsetPanel. Количество вкладок второго tabsetPanel должно зависеть от selectizeInput на вкладках первого уровня.

Этот минимальный пример кажется почти нормальным. Однако при выборе вкладок второго уровня в поле ввода созданные вкладки сразу исчезают.

Проблема в том, как получить вывод selectizeInput в функции lapply.

    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)

person JdP    schedule 25.08.2017    source источник


Ответы (1)


Ответ довольно прост: просто поместите внутреннюю панель tabsetPanel с renderUI

renderUI({
  do.call(tabsetPanel,
          lapply(1:length(input$numbers), function(j) {
            tabPanel(input$numbers[j],
                     h5('test'))

          }))
})

Это предотвратит обновление / обновление selectizeInput (числа)

person JdP    schedule 01.09.2017