我使用bslib-package中的value_box在shiny 的仪表板中显示值.显示的值取决于用户通过各种 Select 器进行的输入,这需要我动态更新值框.使用概述here的方法,这对标题和价值很有效.

但是,我也想根据值来更改值框的类别:例如,如果值低于某个阈值,则显示红色值框,如果值高,则显示绿色值框.

以下是一个MWE来说明我的方法:

library(tidyverse)
library(shiny)
library(bslib)

test_df <- tibble(id = 1:2, 
                  title = c("low value","high value"), 
                  value = c(30, 80))

ui <- page_fixed(
  selectInput("select_id", "Selected ID", choices = 1:2, selected = 1),
  value_box(title = textOutput("vbox_title"),
            value = textOutput("vbox_value"),
            class = textOutput("vbox_class")
  ),
)

server <- function(input, output, session) {

  subset_df <- reactive({
    test_df %>%
      filter(id == input$select_id)
  })
  
  output$vbox_title <- renderText({
    subset_df() %>%
      pull(title)
  })

  output$vbox_value <- renderText({
    subset_df() %>%
      pull(value)
  })
  
  output$vbox_class <- renderText({
    value <- subset_df() %>%
      pull(value)
  
    ifelse(value > 50, "bg-success", "bg-warning")
  })
}

shinyApp(ui, server)

不幸的是,类的文本输出被处理为div list(id = &quot;vbox_class&quot;, class = &quot;shiny-text-output&quot;) list(),我不知道如何将原始字符串传递给类参数.我已经try 使用verbatimTextOutput()和将输出转换为as.character(),但均未成功.

我意识到,只在服务器函数内使用适当的类创建值框会更容易.但在我的实际应用程序中,我实际上需要值框保持不变,因为它包含其他未更新的元素.

有没有办法将容器从textOutput()中移除以使其正常工作?或者,更改类是否需要使用样式标记?

推荐答案

动态更改css类的一个简单解决方案是使用shinyjs.要使用此功能,您需要:

  1. 在用户界面中呼叫useShinyjs
  2. 为您的卡添加ID
  3. 获得价值的react 性:IE value
  4. 更新服务器中的css

它看起来会是这样的:

library(shinyjs)

test_df <- tibble(id = 1:2, 
                  title = c("low value","high value"), 
                  value = c(30, 80))

ui <- page_fixed(
  # invoce Shinyjs:
  useShinyjs(), 
  selectInput("select_id", "Selected ID", choices = 1:2, selected = 1),
  value_box(id = "card1", # set an ID
            title = textOutput("vbox_title"),
            value = textOutput("vbox_value"),
            class = NULL
  )
)

server <- function(input, output, session) {
  
  subset_df <- reactive({
    test_df %>%
      filter(id == input$select_id)
  })
  # Pull reactive here:
  value <- reactive({subset_df() %>% pull(value)})
  
  output$vbox_value <- renderText({
    value()
  })
  
  output$vbox_title <- renderText({
    subset_df() %>%
      pull(title)
  })

  #update CSS class
  observeEvent(value(),{
    if (value() > 50) {
      removeCssClass(id = "card1", class = "bg-warning")
      addCssClass(id = "card1",class = "bg-success")
    }else if(value() <= 50){
      removeCssClass(id = "card1", class = "bg-success")
      addCssClass(id = "card1",class = "bg-warning")
    }
  })

}
shinyApp(ui, server)

这个问题的另一个简单解决方案是使用renderUI并在服务器上呈现整个内容.这看起来应该是这样的:

ui <- page_fixed(
  selectInput("select_id", "Selected ID", choices = 1:2, selected = 1),
  uiOutput("vbox")
)

server <- function(input, output, session) {
  
  subset_df <- reactive({
    test_df %>%
      filter(id == input$select_id)
  })
  output$vbox <- renderUI({
    value_box(
      title = subset_df()$title,
      value = subset_df()$value,
      class = ifelse(subset_df()$value > 50, "bg-success", "bg-warning")
    )
  })

}

shinyApp(ui, server)

Css相关问答推荐

我无法在css中设置填充或边距

如何解决 Spotify 嵌入代码中的白色背景错误?

CSS Select 器仅 Select 具有特定类名称的每行的第一个单元格

使用 mixin 在 SCSS 中进行媒体查询

Nativewind 的某些样式不适用于本机 (Android),但它们适用于网络

条件宽度和省略号不适用于样式化组件 - React.js

如何应用适当样式的元素加消息框?

CSS网格使sibling 项目拉伸

为什么标题中的特定 div 与 Odoo 13 中 PDF 中的页面重叠?

用 svelte 设计 body 元素

reactjs - 容器中水平行的png图像

CSS,居中的 div,缩小以适应?

如何通过单击
  • 激活 HTML 链接?
  • 为什么我们将