Отображение содержимого боковой панели на основе выбранной вкладки - PullRequest
0 голосов
/ 16 мая 2019

У меня блестящая приборная панель с двумя ползунками на боковой панели и двумя панелями вкладок в корпусе.Чего я хочу добиться, так это отображать только «слайдер1», когда я выбираю панель вкладок «слайдер1», и только «слайдер2», когда я выбираю панель вкладок «слайдер2».

## 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)

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Если нет необходимости, я обычно стараюсь избегать рендеринга элементов интерфейса.

Вот решение с использованием условных панелей.

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) {

}
)
1 голос
/ 16 мая 2019

РЕДАКТИРОВАТЬ:

Вот рабочее решение, использующее блестящий JS:

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)

Это может быть лучше, если вы хотите сохранить свой слайдер (то есть спрятать его) вместо повторного рендеринга.


ОРИГИНАЛЬНЫЙ ПОЧТА

Я собирался предложить использовать inyJs , но я не смог заставить его работать - возможно, потому что ползунки настраиваются вна стороне сервера, а не в пользовательском интерфейсе?

Поэтому я выбрал альтернативный подход и обернул ваши 2 вызова функции renderUI в событие наблюдаем ().Я использую оператор 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)
...