2016-12-27 118 views
0

我有一个用shinyDashboard创建的仪表板,它将显示一些操作信息。我们有5个IT组织的领域,我们可以根据环境中发生的情况宣布“触摸”或“不触摸”。闪亮的条件信息框输出

我用一个简单的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(全部是大写字母,对我来说似乎很陌生......)。无论如何,我似乎无法弄清楚如何使这些infoBox()与我正在从RData文件读取的内容保持动态。有小费吗?在调用文本到infoBox()函数而不仅仅是数据框和行/列时,是否有某个函数需要使用?提前致谢!

回答

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) 
+0

这工作完美。我有一些其他的东西做了类似的事情,但对Shiny来说是新手,我仍然试图挑选一些东西并理解。非常感谢! – azdatasci