How to color sliderbar (sliderInput)?

前端 未结 3 2075
暗喜
暗喜 2020-12-01 13:10

I tried to make different color for a few silderInput bar in R shiny. It requires css etc.I looked online and can only find how to make one silderInput. How can

3条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-01 13:34

    The above solutions will not work when sliders are generated dynamically and reused, since it relies on the counting of the class of the container (".js-irs-0"). When reinitializing the slider, the count will increase. Compare sliders 1 vs 2 and 3 in the example below.

    If CSS would allow parent-selectors, one could use the id of the input to select the elements needed (id does not change). Since this is not posssible, another solution is needed. Fortunately the label has a for=id-attribute, which can be used to select the following sibblings - the span-elements containing bars etc. I have also highlighted the label of slider 2 for better understanding. See also this overview of CSS-selectors.

    library(shiny)
    library(shinyjs)
    
    `%||%` <- function(a, b) {
      if (!is.null(a)) a else b
    }
    
    NUM_PAGES <- 3
    
    ui<- fluidPage(
      useShinyjs(), 
      tags$head(tags$style(HTML('.js-irs-1 .irs-single, .js-irs-1 .irs-bar-edge, .js-irs-1 .irs-bar {
                                                      background: purple;
                                }
                                '
      ))
      ),
      tags$head(tags$style(HTML(' [for=sl2]+span>.irs>.irs-single, [for=sl2]+span>.irs-bar-edge, [for=sl2]+span>.irs-bar {
                                                      background: green;} 
    
                                [for=sl2]{color:red;}
                                [for=sl3]+span>.irs>.irs-single, [for=sl3]+span>.irs-bar-edge, [for=sl3]+span>.irs-bar {
                                                      background: grey;} 
    
                                '
      ))
      ),
      uiOutput("ui"),
      br(),
      actionButton("prevBtn", "< Previous"),
      actionButton("nextBtn", "Next >")
      )
    
    server<- function(input, output, session) {
      rv <- reactiveValues(page = 1)
    
      uilist <- reactive(list(
        sliderInput("sl1","Dies ist slider 1", 1,101,input$sl1%||%11),
        sliderInput("sl2","Dies ist slider 2", 2,102,input$sl2%||%22),
        sliderInput("sl3","Dies ist slider 3", 3,103,input$sl3%||%33)
      ))
    
      observeEvent(rv$page,{
        toggleState(id = "nextBtn", condition = rv$page < NUM_PAGES+1)
    
        if(rv$page <= NUM_PAGES){
          #Einzelne Slider
          toggleState(id = "prevBtn", condition = rv$page > 1)
          output$ui<- renderUI(uilist()[[rv$page]])  
        }else{
          #Am Ende Gesamtliste
          output$ui<- renderUI(uilist())
        }
    
    
      })
    
      navPage <- function(direction) {
        rv$page <- rv$page + direction
      }
    
      observeEvent(input$prevBtn, navPage(-1))
      observeEvent(input$nextBtn, navPage(1))
    }
    
    shinyApp(ui, server)
    

提交回复
热议问题