【问题标题】:Dispay sidebar contents based on selected tabpanel根据选定的标签面板显示侧边栏内容
【发布时间】:2019-05-17 04:33:15
【问题描述】:

我有一个闪亮的仪表板,侧边栏中有两个滑块,正文中有两个选项卡面板。我想要实现的是当我选择“slider1”选项卡面板时只显示“slider1”,当我选择“slider2”选项卡面板时只显示“slider2”。

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

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    uiOutput("slider1"),
    uiOutput("slider2")
  ),
  dashboardBody(
    tabsetPanel(
      id = 'testingDPEtab',
      tabPanel("slider1"
      ),
      tabPanel("slider2"
      )
    )
  )
)

server <- function(input, output) {
  output$slider1<-renderUI({
    sliderInput("slider1", label = h3("Slider1"), min = 0, 
                max = 100, value = 50)
  })
  output$slider2<-renderUI({
    sliderInput("slider2", label = h3("Slider2"), min = 0, 
                max = 200, value = 50)
  })
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    编辑:

    这是一个使用 shinyJS 的工作解决方案:

    library(shinydashboard)
    library(shinyjs)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(
        useShinyjs(),
        uiOutput("slider1"),
        uiOutput("slider2")
      ),
      dashboardBody(
        tabsetPanel(
          id = 'testingDPEtab',
          tabPanel("slider1Tab"),
          tabPanel("slider2Tab")
        )
      )
    )
    
    server <- function(input, output) {
      shinyjs::hide(id="slider1")
      shinyjs::hide(id="slider2")
      output$slider1<-renderUI({
        sliderInput("slider1", label = h3("Slider1"), min = 0,
                    max = 100, value = 50)
      })
      output$slider2<-renderUI({
        sliderInput("slider2", label = h3("Slider2"), min = 0,
                    max = 200, value = 50)
      })
    
      observe({
        if(input$testingDPEtab == "slider1Tab"){
          shinyjs::show(id="slider1")
          shinyjs::hide(id="slider2")
        } else {
          shinyjs::hide(id="slider1")
          shinyjs::show(id="slider2")
        }
      })
    }
    
    shinyApp(ui, server)
    

    如果您想保留滑块(即隐藏它)而不是重新渲染它,这可能会更好。


    原帖

    我本来建议使用shinyJs,但我无法让它工作 - 可能是因为滑块是在服务器端而不是在 UI 中设置的?

    所以我采用了另一种方法,并将您的 2 个 renderUI 函数调用包装在一个 observe() 事件中。我使用 if/else 语句根据选定的选项卡将一个控件设置为打开,将第二个控件设置为关闭。似乎工作正常。

    library(shinydashboard)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(
        uiOutput("slider1"),
        uiOutput("slider2")
      ),
      dashboardBody(
        tabsetPanel(
          id = 'testingDPEtab',
          tabPanel("slider1Tab"),
          tabPanel("slider2Tab")
        )
      )
    )
    
    server <- function(input, output) {
      observe({
        if(input$testingDPEtab == "slider1Tab"){
          output$slider1<-renderUI({
            sliderInput("slider1", label = h3("Slider1"), min = 0, 
                        max = 100, value = 50)
          })
          output$slider2<-NULL
        } else {
          output$slider1<-NULL
          output$slider2<-renderUI({
            sliderInput("slider2", label = h3("Slider2"), min = 0, 
                        max = 200, value = 50)
          })
        }
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      【解决方案2】:

      如果没有必要,我通常会尽量避免渲染 UI 元素。

      这是一个使用条件面板的解决方案。

      library(shiny)
      library(shinydashboard)
      
      shinyApp(
      
      ui = dashboardPage(
          dashboardHeader(),
      
          dashboardSidebar(
              conditionalPanel(
                  condition = "input.tabselected == 1",
                  sliderInput("slider1", label = h3("Slider1"), min = 0, 
                          max = 100, value = 50)),
              conditionalPanel(
                  condition = "input.tabselected == 2",
              sliderInput("slider2", label = h3("Slider2"), min = 0, 
                          max = 200, value = 50))
          ),
          dashboardBody(
              tabsetPanel(
                  id = "tabselected",
                  tabPanel("slider1", value = 1
                  ),
                  tabPanel("slider2", value = 2
                  )
              )
          )
      ),
      
      server = function(input, output) {
      
      }
      )
      

      【讨论】:

        猜你喜欢
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 2016-01-06
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多