【问题标题】:Shiny Conditional infoBox Output闪亮的条件信息框输出
【发布时间】:2016-12-27 23:24:30
【问题描述】:

我有一个使用 shinyDashboard 创建的仪表板,它将显示一些操作信息。我们的 IT 组织有 5 个区域可以声明“接触”或“不接触”,具体取决于环境中发生的情况。

我正在使用一个简单的 REST API 来获取数据,它看起来像(单列数据框):

Status
eECC:Touch
DOC:Touch
CCC:Touch
GEN:Touch
IT:No Touch

该数据帧被写入 .RData 文件并使用 reactiveFileReader() 加载。一旦它在那里,我想构建一些 infoBox()es 以在屏幕顶部显示横幅以显示环境以及是否可以对其进行更改。这是我的 ui.R 代码片段:

 fluidRow(
    h4("Touch / No Touch", align="center"),
    infoBox("ECC", "TOUCH", icon = icon("ok", lib = "glyphicon"), width = 2, color = "green"),
    infoBox("DOC", "TOUCH", icon = icon("ok", lib = "glyphicon"), width = 2, color = "green"),
    infoBox("CCC", "TOUCH", icon = icon("ok", lib = "glyphicon"), width = 2, color = "green"),
    infoBox("GEN","TOUCH", icon = icon("ok", lib = "glyphicon"), width = 2, color = "green"),
    infoBox("IT", "NO TOUCH", icon = icon("alert", lib = "glyphicon"), width = 2, color = "red")
    ),

所以,我知道这是一个静态示例。它最初是作为概念证明而实施的。我想要做的是获取从 touchNoTouchDF.RData 文件中读取数据获得的输入,并根据 RData 文件中的内容更改颜色、图标和文本。

我的第一次尝试是使用if else 语句,但它看起来不像那么闪亮,或者我做错了:

fluidRow(
h4("Touch / No Touch", align="center"),
if(touchNoTouchDF[1] == "ECC:Touch") {
infoBox("ECC", "TOUCH", icon = icon("ok", lib = "glyphicon"), width = 2, color = "green")} else { infoBox("ECC", "TOUCH", icon = icon("ok", lib = "glyphicon"), width = 2, color = "green")},
...
...

这似乎不起作用,所以我的下一个想法是在我的数据框中的 infoBox() 函数内“构建”字符串并处理我的 R 脚本中的逻辑。因此,我的数据框(现在 2 列)看起来像:

Status      UI
ECC:Touch   "ECC", "TOUCH", icon = icon("ok", lib = "glyphicon"), width... 

然后,在构建 UI 时,只需执行以下操作:

fluidRow(
  h4("Touch / No Touch", align="center"),
  infoBox(touchNoTouchDF[1,2]),
  infoBox(touchNoTouchDF[2,2]),
  infoBox(touchNoTouchDF[3,2]),
  infoBox(touchNoTouchDF[4,2]),
  infoBox(touchNoTouchDF[5,2])
),

嗯,这只是在 infoBox 上打印文本(全是大写字母,对我来说似乎很奇怪......)。无论如何,我似乎无法弄清楚如何使用我从 RData 文件中读取的内容来使这些 infoBox()es 动态化。有小费吗?在将文本调用到 infoBox() 函数中时,除了数据框和行/列之外,我还必须使用某个函数吗?提前致谢!

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您应该尝试在闪亮应用程序的服务器部分中呈现 infoBox。下面的工作示例:

    ## app.R ##
    library(shiny)
    library(shinydashboard)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(),
      dashboardBody(
        fluidRow(infoBoxOutput('infoBox1'), valueBoxOutput('valueBox1'))
      )
    )
    
    server <- function(input, output) {
      output$infoBox1 <- renderInfoBox({
        x <- runif(1, 0, 10)
        color <- 'green'
        if(x < 5) color <- 'red'
        infoBox(value = x, title = 'Infobox example', color = color)
      })
      output$valueBox1 <- renderValueBox({
        x <- runif(1, 0, 10)
        color <- 'green'
        if(x < 5) color <- 'red'
        valueBox(value = x, subtitle = 'Valuebox example', color = color)
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 这很完美。我有一些其他的项目做类似的事情,但作为 Shiny 的新手,我仍在尝试收集一些东西并理解。非常感谢!
    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2020-07-17
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多