【问题标题】:Assigning custom CSS classes to designed object via external CSS file通过外部 CSS 文件将自定义 CSS 类分配给设计对象
【发布时间】:2017-02-23 17:19:35
【问题描述】:

使用以下结构的 ShinyApp 时:

.
├── server.R
├── ui.R
└── www
    └── custom.css

我想使用custom.css,它通过以下方式链接到应用程序:

tags$head(
    tags$link(rel = "stylesheet", type = "text/css", href = "custom.css")
),

通过将不同的类分配给单独的小部件。

文件

ui.R

ui.R 定义了一些小部件,我想要三个滑块,两个具有不同的类:

library(shiny)

shinyUI(fluidPage(

    # Link CSS file
    tags$head(
        tags$link(rel = "stylesheet", type = "text/css", href = "custom.css")
    ),

    # Application title
    titlePanel("Old Faithful Geyser Data"),

    # Sidebar with a slider input for number of bins
    sidebarLayout(sidebarPanel(
        sliderInput(
            "bins",
            "Number of bins:",
            min = 1,
            max = 50,
            value = 30
        ),

        # Class call to odd class
        sliderInput(
            "binsA",
            "Number of bins (someOddClass):",
            min = 1,
            max = 50,
            value = 30
        ),

        # Class call to even more odd class
        sliderInput(
            "binsB",
            "Number of bins (someEvenMoreOddClass):",
            min = 1,
            max = 50,
            value = 30
        )
    ),

    # Show a plot of the generated distribution
    mainPanel(plotOutput("distPlot"))
)))

custom.css

custom.css 定义了以下类:

.someOddClass {
 font-family: Georgia, "Times New Roman", Times, serif;
 font-size: 23px;
 font-weight: bold;
 color: #336699;
}

.someEvenMoreOddClass {
  background: #fff;
  padding: 10px;
}

server.R

server.R 在本示例的上下文中没有做任何相关的事情:

library(shiny)

shinyServer(function(input, output) {

  output$distPlot <- renderPlot({

    # generate bins based on input$bins from ui.R
    x    <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')

  })

})

附注

工作解决方案源自可用的讨论here,建议在小部件调用中包含style = ...。我对这种方法不感兴趣,因为我想使用 custom.css 文件(从更广泛的工作流程的角度来看,因为文件被更广泛地使用,这很有意义)。

生成的来源:

  <div class="form-group shiny-input-container">
    <label class="control-label" for="binsA">Number of bins (someOddClass):</label>
    <input class="js-range-slider" id="binsA" data-min="1" data-max="50" data-from="30" data-step="1" data-grid="true" data-grid-num="9.8" data-grid-snap="false" data-keyboard="true" data-keyboard-step="2.04081632653061" data-drag-interval="true" data-data-type="number" data-prettify-separator=","/>
  </div>
  <div class="form-group shiny-input-container">
    <label class="control-label" for="binsB">Number of bins (someEvenMoreOddClass):</label>
    <input class="js-range-slider" id="binsB" data-min="1" data-max="50" data-from="30" data-step="1" data-grid="true" data-grid-num="9.8" data-grid-snap="false" data-keyboard="true" data-keyboard-step="2.04081632653061" data-drag-interval="true" data-data-type="number" data-prettify-separator=","/>
  </div>

显示滑块的类的存在:

<input class="js-range-slider" id="binsB" ...

在实践中,我想扩展它并注入另一个对custom.css 中定义的类的调用。自然是把class = ...介绍给inputSlider()

        value = 30,
        class = "someOddClass"
        (...)
    ),

将导致错误,因为该参数在 inputSlider() 的上下文中没有意义:

Error : unused argument (class = "someOddClass")

如何更改 sliderInput() 调用,以便创建引用所需自定义类的标签?

【问题讨论】:

  • 你可以通过id来做吗?还是每个 CSS 类有很多滑块?如果您可以通过id 完成,在您的custom.css 中,您可以使用#binsA 而不是.someOddClass,例如。不过,如果您有很多滑块,那就不太理想了。
  • @NicE 感谢您的关注。 ID 可能是一个后备选项,但我正在使用一些小部件,例如bookmark button,其中 id 不常用,但允许。理想情况下,我想找到一种方法,可以在给定元素上使用或不使用 ID 调用特定类。此外,我想保持custom.css 可能不变,但如果无法在任何元素上调用特定类,则必须执行您建议的解决方案。
  • 好的,那么您可以执行tags$div(class="someEvenMoreOddClass",sliderInput(...)) 之类的操作,将输入包装在您选择的类中的 div 中。最灵活的选择可能是使用index.html 并将类设置在您想要的任何位置,例如here
  • @NicE 谢谢这可以作为一个解决方案。

标签: css r css-selectors shiny


【解决方案1】:

您可以将您的元素包装在 tags$div 中并向该 div 添加一个类:

例如:

tags$div(class="someEvenMoreOddClass",sliderInput(...))

如果您想更准确地确定添加类的位置,可以使用 tags$html 并粘贴 sliderInput 命令的 html 输出,然后将您的类添加到需要添加的位置:

tags$html(HTML('
        <div class="form-group shiny-input-container someEvenMoreOddClass">
          <label class="control-label" for="bins">Number of bins:</label>
          <input class="js-range-slider" id="bins" data-min="1" data-max="50" data-from="30" data-step="1" data-grid="true" data-grid-num="9.8" data-grid-snap="false" data-keyboard="true" data-keyboard-step="2.04081632653061" data-drag-interval="true" data-data-type="number" data-prettify-separator=","/>
        </div>
'))

你也可以像here一样用html构建你的整个ui.R

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 2018-11-13
    • 2019-04-03
    • 2011-06-12
    • 1970-01-01
    • 2023-03-16
    • 2019-03-30
    • 2014-06-19
    • 2020-08-06
    相关资源
    最近更新 更多