2016-09-20 96 views
0

我正在使用Shiny,我试图根据一组参数动态显示一组tabPanels。在下面的代码中,我想让第一个tabPanel只出现在showTab1 <- T等等。在Shiny中动态显示tabPanel

我试着用简单的if语句和conditionalPanels,但是失败了。下面是一个代码示例:

rm(list = ls()) 
library(shiny) 
library(shinydashboard) 

showTab1 <- T 
showTab2 <- F 
showTab3 <- T 


ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(

), 
    dashboardBody(
    uiOutput("tabs") 
) 
) 
server <- function(input, output) { 

output$tabs <- renderUI({ 


    tabBox(width = 1000,height = 500, 

      if (showTab1 == T) { tabPanel("tab1") }, 

      if (showTab2 == T) { tabPanel("tab2") }, 

      if (showTab3 == T) { tabPanel("tab3") } 

     ) 



}) 


} 

shinyApp(ui, server) 

感谢您的帮助。

干杯, 科斯塔斯

+0

感谢您的建议。可以看看下面的答案吗? – mammask

回答

-1

谢谢您的回答较早。根据你的建议,我认为下面的例子可以用于我的案例。我唯一的问题是,最后我无法调整tabBox的宽度和高度。

library(shiny) 
library(shinydashboard) 

showTab1 <- T 
showTab2 <- F 
showTab3 <- T 

ShowTotal <- which(c(showTab1,showTab2,showTab3)) 

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(), 
    dashboardBody(uiOutput("ui")) 
) 
server <- function(input, output) { 

    output$ui <- renderUI({ 

    tabs <- list() 
    k <- 0 

    if (showTab1 == T){ 
     k <- k+1 
     tabs[[k]] <- tabPanel("Tab1", p("A phrase"), br(""), p("I can place a chart here")) 
    } 

    if (showTab2 == T){ 
     k <- k+1 
    tabs[[k]] <- tabPanel("Tab2", p("B phrase"), br(""), p("I can place a chart here")) 
    } 

    if (showTab3 == T){ 
     k <- k+1 
    tabs[[k]] <- tabPanel("Tab3", p("C phrase"), br(""), p("I can place a chart here")) 
    } 


    do.call(tabBox, tabs) 

    }) 
} 

shinyApp(ui, server) 

感谢, 科斯塔斯

+0

这可以通过'do.call(tabBox,c(tabs,height =“200px”)) – mammask

1

您可以动态创建它们:

rm(list = ls()) 
library(shiny) 
library(shinydashboard) 

showTab1 <- T 
showTab2 <- F 
showTab3 <- T 

ShowTotal <- which(c(showTab1,showTab2,showTab3)) 

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(), 
    dashboardBody(uiOutput("ui")) 
) 
server <- function(input, output) { 

    output$ui <- renderUI({ 
    myTabs = lapply(paste('tab', ShowTotal), tabPanel) 
    do.call(tabsetPanel, myTabs) 
    }) 
} 

shinyApp(ui, server) 

enter image description here

+0

如果你看到我以前的回复,我想使用tabBox而不是tabset面板。好的,我明白,lapply可以帮助你避免事情发生,但是对于每个案件我有不同的if语句,并且它更清晰。 – mammask