2016-08-13 29 views
3

我想为我的闪亮应用拥有动态选项卡。我试了下面的代码使用条件面板在闪亮的仪表板中添加动态选项卡

## app.R ## 
library(shiny) 
library(shinydashboard) 

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(
    checkboxGroupInput("Tabs", 
         label = h4("tabpanel"), 
         choices = list("tabs" = "tabs"), 
         selected = NULL), 
    checkboxGroupInput("moreTabs", 
         label = h4("moretabpanel"), 
         choices = list("moretabs" = "moretabs"), 
         selected = NULL) 
), 
    dashboardBody(
    conditionalPanel(
     condition = "input.Tabs == 'tabs'", 
     tabBox(
     title = "intro", 
     id= "ttabs", width = 8, height = "420px", 
     tabPanel("Files", dataTableOutput("Files")), 
     conditionalPanel(
      condition = "input.moreTabs == 'moretabs'", 
      tabPanel("Files1", dataTableOutput("Files1")) 
     ) 
) 
) 
) 
) 
server <- function(input, output) { } 

shinyApp(ui, server) 

但是,我不成功地动态地使用标签面板。它只显示一个标签,并在检查时显示第二个标签。

回答

6

您可以按照下面的示例动态创建ui

例1:使用RenderUI

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

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(
    checkboxGroupInput("Tabs", label = h4("tabpanel"), choices = list("tabs" = "tabs"),selected = NULL), 
    checkboxGroupInput("MoreTabs", label = h4("moretabpanel"), choices = list("moretabs" = "moretabs"),selected = NULL) 
), 
    dashboardBody(
    uiOutput("ui") 
) 
) 
server <- function(input, output) { 

    output$ui <- renderUI({ 

    check1 <- input$Tabs == "tabs" 
    check2 <- input$MoreTabs == "moretabs" 

    if(length(check1)==0){check1 <- F} 
    if(length(check2)==0){check2 <- F} 

    if(check1 && check2){ 
     tabBox(title = "intro",id= "ttabs", width = 8, height = "420px", 
      tabPanel("Files", dataTableOutput("Files")), 
      tabPanel("Files1", dataTableOutput("Files1")) 
    ) 
    } 
    else if(check1){ 
     tabBox(title = "intro",id= "ttabs", width = 8, height = "420px",tabPanel("Files", dataTableOutput("Files"))) 
    } 
    else{return(NULL)} 
    }) 
} 

shinyApp(ui, server) 

enter image description here

示例2:使用conditionalPanel

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

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(
    checkboxGroupInput("Tabs", label = h4("tabpanel"), choices = list("tabs" = "tabs"),selected = NULL), 
    checkboxGroupInput("MoreTabs", label = h4("moretabpanel"), choices = list("moretabs" = "moretabs"),selected = NULL) 
), 
    dashboardBody(

    conditionalPanel(
     condition = "input.MoreTabs == 'moretabs' && input.Tabs == 'tabs'", 
     tabBox(
     title = "intro", 
     id= "ttabs", width = 8, height = "420px", 
     tabPanel("Files",value=1, dataTableOutput("Filesa")), 
     tabPanel("Files1",value=2, dataTableOutput("Files1a")) 
    ) 
    ), 

    conditionalPanel(
     condition = "input.Tabs == 'tabs' && input.MoreTabs != 'moretabs'", 
     tabBox(
     title = "intro", 
     id= "ttabs", width = 8, height = "420px", 
     tabPanel("Files",value=3, dataTableOutput("Files")) 
    )) 
)) 
server <- function(input, output) { } 
shinyApp(ui, server) 
+0

谢谢您的回答,但我没有兴趣使用'renderUI ' –

+1

'renderUI'就是这样做的方法。 – jdharrison

+1

@AaghazHussain,我绝对更喜欢'renderUI'选项,但是你也可以使用'conditionalPanel'工作,但是必须改变'tabPanel'的'value'值。 –

相关问题