当数据丢失时,如何在R Shiny中创建一个valueBox?

g52tjvyc  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(85)

我有一个闪亮的应用程序类似于下面的例子。
x1c 0d1x的数据
我使用valueBox()来返回一些值,这些值对应于数据中的特定变量。在本例中,我只是使用 LeftRight 作为示例,其中框根据值是否大于100而着色。我遇到的问题是,当我从数据中选择一个不存在于数据中的名称时,它会在 Jmeter 板主体中返回一个丑陋的错误,就像下面的附加图像一样。

我的首选项是,即使特定变量和/或名称的数据丢失,值框仍然可见。是的,我可以从“编辑”菜单编辑名称,但这不是一个选项,因为我要求所有可能的名称都存在。我希望值框读取类似 NA 的内容,而不是具有预期变量名称的特定值(例如,* 左 * 或 * 右 *)作为副标题(就像第一张图片中的副标题一样)。所有这些都将在白色背景上进行。这样,对于查看我的应用程序的其他最终用户来说,这看起来会干净得多。
有没有人有任何变通方法或解决方案,这个特定的问题使用我的示例数据/代码下面?

示例代码:

library(shiny)
library(shinydashboard)
library(tidyverse)

# Unique names for dropdown list.
names <- paste("Name", LETTERS[1:10])

# Example data.
set.seed(1)
dat <- data.frame(
  name = rep(paste("Name", LETTERS[c(1:6, 9:10)]), times = 2),
  date = rep(Sys.Date() + sample(1:10, 8), times = 2),
  var = c(rep("Left", 8), rep("Right", 8)),
  value = round(rnorm(16, 100, 20), 1)
  )

##### APP #####

ui <- dashboardPage(
  dashboardHeader(title = "Example App"),
  
  dashboardSidebar(
    sidebarMenu(
      menuItem("Tab One",
               tabName = "tab1")
      )
    ),
  
  dashboardBody(
    tabItem(tabName = "tab1",
            fluidRow(
              box(selectInput("name", "Select Name:",
                              names,
                              selected = "Name A",
                              multiple = FALSE),
                  width = 12),
              valueBoxOutput("box1", width = 2),
              valueBoxOutput("box2", width = 2)
              )
            )
    )
  )

server <- function(input, output){
  
  x <- reactive({
    dat %>%
      filter(name == input$name)
    })
  
  output$box1 <- renderValueBox({
    valueBox(value = first(x()$value),
             subtitle = "Left",
             color = ifelse(first(x()$value) >= 100, "green", "red")
             )
  })
  
  output$box2 <- renderValueBox({
    valueBox(value = last(x()$value),
             subtitle = "Right",
             color = ifelse(last(x()$value) >= 100, "green", "red")
    )
  })
  
  }

shinyApp(ui = ui, server = server)

字符串

kyxcudwk

kyxcudwk1#

正如@Limey已经建议的那样,使用ififelse来解释任何NA值。然而,由于"white"不是有效的颜色(参见错误消息),我使用"black"来处理NA情况:

set_color <- function(x) {
  if (is.na(x)) {
    return("black")
  }
  if (x >= 100) "green" else "red"
}

server <- function(input, output) {
  x <- reactive({
    dat %>%
      filter(name == input$name)
  })

  output$box1 <- renderValueBox({
    valueBox(
      value = first(x()$value),
      subtitle = "Left",
      color = set_color(first(x()$value))
    )
  })

  output$box2 <- renderValueBox({
    valueBox(
      value = last(x()$value),
      subtitle = "Right",
      color = set_color(last(x()$value))
    )
  })
}

字符串
x1c 0d1x的数据

相关问题