如何为滑块(sliderInput)着色?

Posted

技术标签:

【中文标题】如何为滑块(sliderInput)着色?【英文标题】:How to color sliderbar (sliderInput)? 【发布时间】:2016-08-22 17:19:19 【问题描述】:

我尝试为 R 中的几个 silderInput 条制作不同的颜色。它需要css等。我在网上看了,只能找到如何制作一个silderInput。如何为不同的条创建几种不同的颜色?

这是我的测试代码。它将以相同的样式显示所有栏:

 ui <- fluidPage(
   tags$style(type = "text/css", "
              .irs-bar width: 100%; height: 25px; background: black; border-top: 1px solid black; border-bottom: 1px solid black;
              .irs-bar-edge background: black; border: 1px solid black; height: 25px; border-radius: 0px; width: 20px;
              .irs-line border: 1px solid black; height: 25px; border-radius: 0px;
              .irs-grid-text font-family: 'arial'; color: white; bottom: 17px; z-index: 1;
              .irs-grid-pol display: none;
              .irs-max font-family: 'arial'; color: black;
              .irs-min font-family: 'arial'; color: black;
              .irs-single color:black; background:#6666ff;
              .irs-slider width: 30px; height: 30px; top: 22px;

             .irs-bar1 width: 50%; height: 25px; background: red; border-top: 1px solid black; border-bottom: 1px solid black;
              .irs-bar-edge1 background: black; border: 1px solid red; height: 25px; border-radius: 0px; width: 20px;
              .irs-line1 border: 1px solid red; height: 25px; border-radius: 0px;
              .irs-grid-text1 font-family: 'arial'; color: white; bottom: 17px; z-index: 1;
              .irs-grid-pol1 display: none;
              .irs-max1 font-family: 'arial'; color: red;
              .irs-min1 font-family: 'arial'; color: red;
              .irs-single1 color:black; background:#6666ff;
              .irs-slider1 width: 30px; height: 30px; top: 22px;

             "),

  uiOutput("testSlider")
  )

server <- function(input, output, session)
  output$testSlider <- renderUI(
    fluidRow(
      column(width=3, 
             box(
               title = "Preferences", width = NULL, status = "primary",
               sliderInput(inputId="test", label=NULL, min=1, max=10, value=5, step = 1, width='100%'),
               sliderInput(inputId="test2", label=NULL, min=1, max=10, value=5, step = 1, width='50%')
             )     
      ))
  )


shinyApp(ui = ui, server=server)

【问题讨论】:

【参考方案1】:

以下是如何修改滑块的style 的示例代码。您可以向其中添加自己的逻辑。

rm(list = ls())
library(shiny)
ui <- fluidPage(
  # All your styles will go here
  tags$style(html(".js-irs-0 .irs-single, .js-irs-0 .irs-bar-edge, .js-irs-0 .irs-bar background: purple")),
  tags$style(HTML(".js-irs-1 .irs-single, .js-irs-1 .irs-bar-edge, .js-irs-1 .irs-bar background: red")),
  tags$style(HTML(".js-irs-2 .irs-single, .js-irs-2 .irs-bar-edge, .js-irs-2 .irs-bar background: green")),

  sliderInput("slider1", "Slider 1",min = 0.1, max = 1, value = 0.4, step = 0.05),
  sliderInput("slider2", "Slider 2",min = 0.1, max = 1, value = 0.4, step = 0.05),                               
  sliderInput("slider3", "Slider 3",min = 100, max = 20000, value = 5000, step= 200)

)
server <- function(input, output, session)
shinyApp(ui = ui, server=server)

【讨论】:

如何接受?我点击了向上箭头。这是否意味着我接受了它?再次感谢您的帮助! @czqiu 见这里:How does accepting an answer work? 使用这个,很高兴它工作。但是,当您的应用程序中有 50 个滑块可供样式时,这是一种乐趣..... 我喜欢这个解决方案,但是您的代码似乎并没有改变蓝色边框的颜色。有可能吗?【参考方案2】:

不幸的是,上一个答案只为我改变了条形颜色,而不是上面的数字标签。这对他们其余的人来说都是诀窍。 (用你喜欢的颜色替换十六进制颜色代码)。

/* changes the colour of the bars */ 
tags$head(tags$style(HTML('.js-irs-0 .irs-single, .js-irs-0 .irs-bar-edge, .js-irs-0 .irs-bar 
                                                  background: #000069;
                                                  border-top: 1px solid #000039 ;
                                                  border-bottom: 1px solid #000039 ;

                            /* changes the colour of the number tags */
                           .irs-from, .irs-to, .irs-single  background: #000069 '
                    ))
               )

【讨论】:

【参考方案3】:

当滑块是动态生成的并且reused 时,上述解决方案将不起作用,因为它依赖于容器类(“.js-irs-0”)的计数。重新初始化滑块时,计数会增加。比较下例中​​的滑块 1 与 2 和 3。

如果 CSS 允许父选择器,则可以使用输入的 id 来选择所需的元素(id 不会改变)。由于这是not posssible,因此需要另一个解决方案。幸运的是,该标签有一个for=id-attribute,可用于选择以下同级 - 包含条的跨度元素等。我还突出显示了滑块 2 的标签以便更好地理解。另请参阅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)

【讨论】:

以上是关于如何为滑块(sliderInput)着色?的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny 中的 sliderInput 出现问题 - 获取 NaN

iPhone - 如何为图像着色?

如何为手机构建滑块拼图软件

如何为缩略图 Woocommerce 创建滑块

如何为 Git 控制台着色?

如何为 System.out.println 输出着色? [复制]