带有不同边栏的标签

时间:2017-06-14 09:25:54

标签: r shiny

我正在尝试使用多个标签创建一个闪亮的应用。每个标签都有自己的侧边栏。我无法让这个工作。任何有关错误的帮助将不胜感激。 以下是代码

    ui <- fluidPage(

  titlePanel("Hi"),    

  sidebarLayout(position = "left",
                sidebarPanel(
                  conditionalPanel(condition = "input.tabs1==1",
                                   selectizeInput('invar',"Reg in", choices = varnames, multiple = TRUE)),
                  conditionalPanel(condition = "input.tabs1==2",
                                   selectizeInput('outvar',"Reg out", choices = predictors, multiple = FALSE)),

                ),

                mainPanel(
                  tabsetPanel(id="tabs1",
                              tabPanel("input",value=1,plotOutput("Input"),
                              tabPanel("output",value=2,plotOutput("Output")
                              ))))
  )) 

2 个答案:

答案 0 :(得分:3)

首先,再次检查您的代码。你犯了以下错误:

  • 一个tabPanel嵌套在另一个
  • 在第二个conditionalPanel()的末尾有一个额外的逗号,因此您将空元素传递给sidebarPanel()

如果我纠正你的错误并创建一个模拟的例子,那么它的工作原理非常好。所以这里确实没有问题:

ui <- fluidPage(

  titlePanel("Hi"),    
  sidebarLayout(position = "left",
                sidebarPanel(
                  conditionalPanel(condition = "input.tabs1==1",
                                   selectizeInput('invar',"Reg in", choices = letters[1:3], multiple = TRUE)),
                  conditionalPanel(condition = "input.tabs1==2",
                                   selectizeInput('outvar',"Reg out", choices = letters[4:6], multiple = FALSE))

                ),
                mainPanel(
                  tabsetPanel(id="tabs1",
                              tabPanel("input",value=1,plotOutput("Input")),
                              tabPanel("output",value=2,plotOutput("Output"))
                              )
                  )
  )) 

server <- function(input, output, session){
  output$Input <- renderPlot(plot(1))
  output$Output <- renderPlot(plot(2))
}

shinyApp(ui, server)

您也可以使用renderUI

执行此操作
ui <- fluidPage(

  titlePanel("Hi"),    

  sidebarLayout(position = "left",
                sidebarPanel(
                  uiOutput("mysidebar")
                                  ),

                mainPanel(
                  tabsetPanel(id="tabs1",
                              tabPanel("input",value=1,plotOutput("Input")),
                              tabPanel("output",value=2,plotOutput("Output")
                                       )))
  )) 
server <- function(input, output, session){
  output$mysidebar <- renderUI({
    if(input$tabs1 == 1){
      selectizeInput('invar',"Reg in", choices = letters[1:3])
    } else if(input$tabs1 == 2){
      selectizeInput('outvar',"Reg out", choices = letters[4:6])
    }
  })
}
shinyApp(ui,server)

答案 1 :(得分:-1)

我以非常不同但有效的方式做到这一点。

shinyApp(
 shinyUI(
 fluidPage(
    uiOutput('mainpage')
) 
),
shinyServer(function(input, output, session) {
panel <- reactiveValues(side = NULL)
output$mainpage  <- renderUI({
   sidebarLayout(position = "left",
     sidebarPanel(
           uiOutput(panel$side)
     ),
     mainPanel(
              tabsetPanel(id="tabs1",
                          tabPanel("input",value=1,plotOutput("Input")),
                          tabPanel("output",value=2,plotOutput("Output"))
                          )
     )
  })
output$sideinput <- renderUI({
tagList(
    selectizeInput('invar',"Reg in", choices = varnames, multiple = TRUE))
    )
})
output$sideoutput <- renderUI({
tagList(
 selectizeInput('outvar',"Reg out", choices = predictors, multiple =FALSE)
    )
})
observeEvent(input$tabs1,{
   panel$side <- switch(input$tabs1,
                      1 = 'sideinput',
                      2 = 'sideoutput')
})

基本上我使用观察者作为我的条件并将所需面板的值分配给分配给该面板位置的变量名称