首页 > 解决方案 > 如何动态选择闪亮的仪表板皮肤?

问题描述

我想通过 selectInput 反应性地选择闪亮仪表板的皮肤。

我尝试了以下代码,但仪表板框架消失了。

library(shiny)

library(shinydashboard)

ui <- uiOutput("ui")

server <- function(input, output, session) {

  shiny.session <- reactiveValues(skin = "blue")

  ui <- function() {
    dashboardPage(dashboardHeader(disable = FALSE),
                  dashboardSidebar(),
                  dashboardBody(),
                  skin = shiny.session$skin)
  }

  output$ui <- renderUI(ui())

}

shinyApp(ui, server)

标签: rshinyshinydashboard

解决方案


皮肤由 shinydashboard 主体的类决定:<body class="skin-blue" style="min-height: 611px; height: auto;">

我们可以使用一些 javascript 动态更改类。这是一个小例子:

example_app_gif

library(shiny)
library(shinydashboard)

js <- "Shiny.addCustomMessageHandler('change_skin', function(skin) {
        document.body.className = skin;
       });"

ui <- function() {
    dashboardPage(dashboardHeader(),
                  dashboardSidebar(),
                  dashboardBody(
                      tags$head(tags$script(js)),
                      selectInput("skin_color", "Skin Color", 
                                  c("blue", "black", "purple", 
                                    "green", "red", "yellow"))
                  ),
                  skin = "blue")
}

server <- function(input, output, session) {
    observeEvent(input$skin_color, {
        session$sendCustomMessage("change_skin", paste0("skin-", input$skin_color))
    })
}

shinyApp(ui, server)

推荐阅读