R Shiny - добавить tabPanel в tabsetPanel динамически (с использованием renderUI)
Я разрабатываю блестящее приложение, в котором я использую tabsetPanel
, который генерируется, когда пользователь вводит определенный ввод. Таким образом, я хочу использовать функцию renderUI
, чтобы сделать tabsetPanel появляться/исчезать.
Моя борьба теперь состоит в том, что количество tabPanel
элементов (аргументы tabsetPanel
) также зависит от пользовательского ввода, в порядке: иногда мне нужно 1, в других случаях я хочу больше tabPanels
.
Как это сделать? Я попытался включить conditionPanel
или включить простое условие if()...
в аргументе tabsetPanel
, но он (а не удивительно...) не работал.
Ответы
Ответ 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 все панели должны быть несколько однородными.)
Образец решения и кода можно найти в ответе здесь. Если потребуется, я также могу отправить код здесь.