首页 > 解决方案 > 根据选定的标签面板显示侧边栏内容

问题描述

我有一个闪亮的仪表板,侧边栏中有两个滑块,正文中有两个选项卡面板。我想要实现的是当我选择“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)

标签: rshinyshinydashboard

解决方案


编辑:

这是使用 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)

推荐阅读