2016-11-03 2 views
1

У меня есть navbarMenu с набором tabPanels, который отлично работает (код 1 ниже), но я хочу сделать эту динамику, чтобы я мог добавлять или удалять tabPanels на основе состояния при запуске , Что-то вроде того, что у меня есть в блоке 2 ниже (но это не работает). Я вижу пару ссылок, где люди говорят, что это невозможно, но кажется, что должен быть способ. На самом деле мне нужно включить или не включать tabPanels при запуске и не нуждаться в том, чтобы он был действительно динамичным.Dynamic navbarMenu tabPanels in R Shiny

Я вижу пример, близкий к tabsetPanel: R Shiny - add tabPanel to tabsetPanel dynamically (with the use of renderUI). И вот он говорит, что это невозможно: reactive tabPanel in a navbarMenu in Shiny

Блок 1: работает, но не динамический

library(shiny) 
runApp(list(
    ui = navbarPage(

    tabPanel("a" 

    ), 
    tabPanel("b"), 
    navbarMenu('g', 
       tabPanel("c"), 
       tabPanel("d") 
    ) 
), 
    server = function(input, output, session){ 


    } 
)) 

Блок 2: Я хочу что-то вроде этого - это не работает

library(shiny) 
runApp(list(
    ui = navbarPage(

    tabPanel("a" 

    ), 
    tabPanel("b"), 
    navbarMenu('g', 
       uiOutput('tabs') 
    ) 
), 
    server = function(input, output, session){ 

    output$tabs <- renderUI({ 

     listoftabs <- c("c", "d") 
     lapply(listoftabs, tabPanel) 

    }) 
    } 
)) 

reactive tabPanel in a navbarMenu in Shiny

+0

Вам нужно поместить 'narbarMenu' внутри' renderUI'. Вы не можете просто добавить 'tabPanel' в существующую' navbarMenu' или 'tabsetPanel' (пример, который работает, имеет' tabsetPanel' внутри 'renderUI'). –

+0

Вы проверили это? Я тестировал много разных вариантов этого, и никто, похоже, не работает. Действительно ли navbarMenu работает из renderUI? – ZRoss

+0

Жаль, что 'navbarMenu' не работает. Причина в том, что 'navbarMenu' является частью' navbarPage'. Когда вы помещаете 'navbarMenu' в' navbarPage', он генерирует два элемента HTML: один для ссылки меню, другой для фактической панели 'div'. Когда вы используете его с 'renderUI', вы получаете панель' div'. Если вам нужна динамика, вам придется перерисовать весь «navbarPage» –

ответ

0

Ответ от @warmoverflow (спасибо!) с ifelse может работать с очень ограниченным количеством вкладок, но если вкладка, которую вы хотите включить или исключить, является средней вкладкой, она не будет работать должным образом с учетом запятых. Вот решение, в котором я переписал функцию navbarMenu только немного, чтобы позволить вам упасть вкладку удовлетворяющую условию

library(shiny) 
runApp(list(
    ui = navbarPage(

    tabPanel("a" 

    ), 
    tabPanel("b"), 
    f('g', drop = ifelse(1==1, 2, 3), 
       tabPanel("first"), 
       tabPanel("firstinside"), 
       tabPanel("secondinside"), 
       tabPanel("last") 
    ) 
), 
    server = function(input, output, session){ 


    } 
)) 



f <- function (title, drop , ..., icon = NULL) 
{ 
    structure(list(title = title, tabs = list(...)[-drop], iconClass = shiny:::iconClass(icon)), 
     class = "shiny.navbarmenu") 
} 
Смежные вопросы