R Shiny中条件面板内滑块颜色修改失败,求技术解决方案
解决Shiny条件面板内滑块颜色无法修改的问题
问题原因
setSliderColor在UI初始化时执行,但条件面板中的slider2初始状态是隐藏的,未被渲染到DOM中,因此初始化时的颜色设置无法作用到它。只有当条件满足(input.num > '1')滑块被动态渲染后,才能对其应用样式。
解决方案1:全局CSS样式(推荐)
直接通过CSS全局设置所有滑块的颜色,无论滑块是初始化渲染还是动态渲染,都会生效:
library(shiny) library(shinyjs) library(shinyWidgets) library(shinydashboard) MyData <- read.csv("/Users/s/Desktop/ShinyTest/ForShiny8.csv") # Define UI ---- ui <- dashboardPage( dashboardHeader(title = "PP", titleWidth = 500), dashboardSidebar(disable = TRUE), dashboardBody( useShinyjs(), # 全局设置滑块颜色为黑色 tags$style(HTML(" /* 滑块进度条 */ .irs-bar { background: black !important; border-top: 1px solid black !important; border-bottom: 1px solid black !important; } /* 滑块进度条边缘 */ .irs-bar-edge { background: black !important; border: 1px solid black !important; } /* 滑块手柄 */ .irs-slider { background: black !important; } ")), box( status = "danger",width = 8, fluidRow( column(6, selectInput("DrillName1", label = "Choose a Drill:", choices = unique(MyData$Drill), selected = NULL, multiple = FALSE) ), column(6, sliderInput("slider1", label = ("Time in minutes"), min = 0, max = 60, value = 0) ) ), fluidRow( conditionalPanel( condition = "input.num > '1'", column(6, selectInput("DrillName2", label = "Choose a Drill:", choices = unique(MyData$Drill), selected = NULL, multiple = FALSE) ), column(6, sliderInput("slider2", label = ("Time in minutes"), min = 0, max = 60, value = 0) ) ) ) ) ) ) # Define server logic ---- server <- function(input, output, session) { } # Create Shiny app ---- shinyApp(ui = ui, server = server)
解决方案2:动态调用颜色设置
通过监听input.num的变化,当滑块被渲染后,动态调用setSliderColor:
library(shiny) library(shinyjs) library(shinyWidgets) library(shinydashboard) MyData <- read.csv("/Users/s/Desktop/ShinyTest/ForShiny8.csv") # Define UI ---- ui <- dashboardPage( dashboardHeader(title = "PP", titleWidth = 500), dashboardSidebar(disable = TRUE), dashboardBody( useShinyjs(), box( status = "danger",width = 8, fluidRow( column(6, selectInput("DrillName1", label = "Choose a Drill:", choices = unique(MyData$Drill), selected = NULL, multiple = FALSE) ), column(6, sliderInput("slider1", label = ("Time in minutes"), min = 0, max = 60, value = 0) ) ), fluidRow( conditionalPanel( condition = "input.num > '1'", column(6, selectInput("DrillName2", label = "Choose a Drill:", choices = unique(MyData$Drill), selected = NULL, multiple = FALSE) ), column(6, sliderInput("slider2", label = ("Time in minutes"), min = 0, max = 60, value = 0) ) ) ), # 初始化设置第一个滑块颜色 setSliderColor(c("black"), 1) ) ) ) # Define server logic ---- server <- function(input, output, session) { # 监听num输入,当条件满足时设置第二个滑块颜色 observeEvent(input$num, { if(input$num > 1){ # 调用shinyWidgets的JS函数设置滑块颜色 runjs("setSliderColor(['black'], [2]);") } }) } # Create Shiny app ---- shinyApp(ui = ui, server = server)
说明
- 方案1通过CSS直接覆盖滑块的默认样式,无需考虑渲染时机,更简洁稳定。
- 方案2针对动态渲染的滑块,在其出现后再执行颜色设置,适合需要单独设置不同滑块颜色的场景。
内容的提问来源于stack exchange,提问作者Sonia
相关产品推荐
相关产品推荐

