You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shiny应用中根据条件动态修改同一Box的颜色?

问题原因及解决办法

问题1:样式代码未被正确渲染

你在renderUI块里先定义了tags$style,但R函数默认只返回最后一行代码的结果(也就是box),所以前面的样式代码根本没被添加到页面中,自然无法生效。

问题2:全局类名导致样式冲突

两个盒子都使用了.box-danger这个全局类,就算样式能生效,后加载的样式也会覆盖前面的,最终两个盒子颜色一致,无法分别控制。

修复后的完整代码

## app.R ##
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    uiOutput("box1"),
    uiOutput("box2")
  )
)

server <- function(input, output) { 
  
  output$box1<-renderUI({
    # 给当前盒子设置唯一自定义类,避免样式冲突
    box_class <- "box-custom-1"
    if(nrow(iris)==150){
      box_style <- tags$style(
        type = 'text/css',
        paste0(".", box_class, "{border-top-style: none; border-left-color: green; border-left-style: solid;}")
      )
    } else {
      box_style <- tags$style(
        type = 'text/css',
        paste0(".", box_class, "{border-top-style: none; border-left-color: red; border-left-style: solid;}")
      )
    }
    # 用tagList包裹样式和盒子,确保两者都能被渲染输出
    tagList(
      box_style,
      box(
        title = "title", 
        closable = TRUE, 
        width = 10,
        status = "danger", 
        solidHeader = FALSE, 
        collapsible = TRUE,
        collapsed = TRUE,
        class = box_class # 绑定自定义类
      )
    )
  })
  
  output$box2<-renderUI({
    box_class <- "box-custom-2"
    if(nrow(mtcars)==32){
      box_style <- tags$style(
        type = 'text/css',
        paste0(".", box_class, "{border-top-style: none; border-left-color: green; border-left-style: solid;}")
      )
    } else {
      box_style <- tags$style(
        type = 'text/css',
        paste0(".", box_class, "{border-top-style: none; border-left-color: red; border-left-style: solid;}")
      )
    }
    tagList(
      box_style,
      box(
        title = "title", 
        closable = TRUE, 
        width = 10,
        status = "danger", 
        solidHeader = FALSE, 
        collapsible = TRUE,
        collapsed = TRUE,
        class = box_class
      )
    )
  })
}

shinyApp(ui, server)

关键改动说明

  • 使用tagList()将样式代码和盒子组件包裹在一起,确保两者都能被renderUI输出到页面。
  • 给每个盒子设置唯一的自定义类,样式代码针对该类进行设置,避免全局样式冲突,实现两个盒子独立控制颜色。
  • 用paste0()动态拼接自定义类名,简化代码逻辑。

内容的提问来源于stack exchange,提问作者firmo23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:45:33