Подтвердить что ты не робот

R Shiny - добавить tabPanel в tabsetPanel динамически (с использованием renderUI)

Я разрабатываю блестящее приложение, в котором я использую tabsetPanel, который генерируется, когда пользователь вводит определенный ввод. Таким образом, я хочу использовать функцию renderUI, чтобы сделать tabsetPanel появляться/исчезать.

Моя борьба теперь состоит в том, что количество tabPanel элементов (аргументы tabsetPanel) также зависит от пользовательского ввода, в порядке: иногда мне нужно 1, в других случаях я хочу больше tabPanels.

Как это сделать? Я попытался включить conditionPanel или включить простое условие if()... в аргументе tabsetPanel, но он (а не удивительно...) не работал.

4b9b3361

Ответ 1

Здесь вы идете. Код достаточно понятен.

library(shiny)
runApp(list(
  ui = pageWithSidebar(
    headerPanel('Dynamic Tabs'),
    sidebarPanel(
      numericInput("nTabs", 'No. of Tabs', 5)
    ),
    mainPanel(
      uiOutput('mytabs')  
    )
  ),
  server = function(input, output, session){
    output$mytabs = renderUI({
      nTabs = input$nTabs
      myTabs = lapply(paste('Tab', 1: nTabs), tabPanel)
      do.call(tabsetPanel, myTabs)
    })
  }
))

Ответ 2

Существует способ динамически добавлять tabPanels без renderUI, что может быть не так очевидно, как версия с renderUI. Я написал функцию addTabToTabset, которая добавит любой (список) tabPanel (s) в tabset/navbar.

Этот подход имеет набор преимуществ с использованием renderUI:

  • Существующие tabPanels не перерисовываются каждый раз при добавлении новой панели. (Быстрее)
  • Таким образом, не сбросьте все входные переменные внутри существующих панелей. (нет необходимости в замене переменных)
  • Структура содержимого панели может быть выбрана индивидуально. (В версии lapply - renderUI все панели должны быть несколько однородными.)

Образец решения и кода можно найти в ответе здесь. Если потребуется, я также могу отправить код здесь.