【问题标题】:add CSS class to shiny textOutput将 CSS 类添加到闪亮的 textOutput
【发布时间】:2018-08-16 01:14:31
【问题描述】:

我需要为闪亮应用中的一系列 textOutput 添加一个 CSS 类。

当我尝试时,例如:

textOutput('text', class = 'error')

我明白了:

Warning: Error in textOutput: unused argument (class = "error")

可以更改该 textOutput 的 id 的 CSS。但是,我的 ID 是动态生成的,所以这不是一个好的解决方案。一种可能的替代方法是“抓取”所有以“error”开头/包含“error”(例如“error1”、“error2”)的 id,但我不确定这在我的 CSS 样式表中是否可行。

【问题讨论】:

标签: css r shiny css-selectors


【解决方案1】:

一个简单的方法是使用闪亮的tagAppendAttributes 函数。我通常发现将闪亮输出对象的 HTML 输出通过管道传输到其中更容易,如下所示:

library(shiny)
library(magrittr)

textOutput("foo") %>% 
  tagAppendAttributes(class = 'error')

这会产生以下输出,其中包含错误类。

<div class="shiny-text-output error" id="foo"></div>

你也可以用样式做同样的事情

textOutput("foo") %>% 
  tagAppendAttributes(style= 'color:green;')
<div id="foo" class="shiny-text-output" style="color:green;"></div>

【讨论】:

  • 请问您知道我们是否也可以使用相同的技术“tagAppendAttributes”来添加单个特定表格的样式?我只是尝试了以下但它没有做任何事情: tableOutput("retail_dashboard_ratios_table") %>% tagAppendAttributes(style = '{ border-collapse: collapse; font-size:20px; color:red;}')
  • 不带括号试试看:tableOutput("retail_dashboard_ratios_table") %&gt;% tagAppendAttributes(style = 'border-collapse: collapse; font-size:20px; color:red;')
【解决方案2】:

也许用所需的类将它包装在一个 div 中会有所帮助?:

library(shiny)

ui <- fluidPage(tags$div(id = 'wrap_div',
                         class = 'error',
                         textOutput('text')))

server <- function(input, output, session) {
  output$text <- renderText ({
    "My text"
  })
}

shinyApp(ui = ui, server = server)

【讨论】:

    【解决方案3】:

    各种*Output 函数返回具有您可以操作的属性的对象,其中class ——只需使用str() 函数检查它们的str结构:

    foo <- textOutput("foo")
    print(foo)
    # <div id="foo" class="shiny-text-output"></div>
    str(foo)
    # List of 3
    #  $ name    : chr "div"
    #  $ attribs :List of 2
    #   ..$ id   : chr "foo"
    #   ..$ class: chr "shiny-text-output"
    #  $ children: list()
    #  - attr(*, "class")= chr "shiny.tag"
    

    这意味着我们可以像这样覆盖textOutput函数设置的class

    foo$attribs$class <- "foo bar"
    print(foo)
    # <div id="foo" class="foo bar"></div>
    

    如果您想在添加新类的同时保留现有类,可以使用 paste() 函数,并将其全部包装在自定义 add_classes() 函数中以方便:

    add_classes <- function(el, classes) {
      el$attribs$class <- paste(el$attribs$class, classes)
      el
    }
    
    foo <- add_classes(foo, "baz qux")
    print(foo)
    # <div id="foo" class="foo bar baz qux"></div>
    

    【讨论】:

      【解决方案4】:

      答案是使用 CSS 选择器,例如:

      [id^="error"] {
         ...
      }
      

      这被放置在应用程序目录内的外部 css 文件中...通常命名为 style.css。

      【讨论】:

      • 你能扩展这个答案吗?你把这段代码放在哪里?完整的代码将不胜感激。
      猜你喜欢
      • 2015-06-16
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2020-02-21
      • 2018-03-09
      • 1970-01-01
      • 2020-08-08
      相关资源
      最近更新 更多