背景
我每小时报告一次建筑物中的设备,很多建筑物和很多设备。设备上的每个参数都称为一个点,它们已经有一个名称,我无法选择该点的名称。每个点名称都是唯一的。我要做的是在每栋建筑上运行标准报告。最后,我想把它移到Shiny看看我的图表,然后从那里打印一份报告,但是......小步骤。
问题
我是否走在正确的轨道上?有更有效的方法吗?当我开始撰写Markdown报告或将其转移到Shiny时,我是否会遇到问题?
示例代码
library(tidyverse)
set.seed(55)
test_func <- function(pointa, pointb, mult) {
out = (pointb - pointa) * mult
return(out)
}
test_fail <- function(pointa, pointb) {
out = ifelse(pointa > (pointb - 9), 1, 0)
return(out)
}
tbl.data <- data.frame(
date = c(rep("2/1/2018", 24),
rep("2/2/2018", 24),
rep("2/3/2018", 24),
rep("2/4/2018", 24),
rep("2/5/2018", 24),
rep("2/6/2018", 24),
rep("2/7/2018", 24)),
hour = rep(0:23, 7),
equipa.vala = runif(168, min = 50, max = 60),
equipb.vala = runif(168, min = 50, max = 60)
) %>%
mutate(
equipa.valb = 10 + equipa.vala * runif(168, min = 0.75, max = 1.25),
equipb.valb = 10 + equipb.vala * runif(168, min = 0.75, max = 1.25)
)
tbl.equip <- data.frame(
equipment.id = c(1,2),
equipment.name = c("equipa", "equipb"),
equipment.mult = c(5, 7)
)
tbl.point <- data.frame(
point = c("equipa.vala", "equipa.valb", "equipb.vala", "equipb.valb"),
equipment = c("equipa", "equipa", "equipb", "equipb"),
category = c("vala", "valb", "vala", "valb")
)
for (eq in tbl.equip[,2]) {
vala <- as.character(
tbl.point$point[tbl.point$equipment == eq &
tbl.point$category == "vala"]
)
valb <- as.character(
tbl.point$point[tbl.point$equipment == eq &
tbl.point$category == "valb"]
)
equip.mult <- as.numeric(
tbl.equip$equipment.mult[tbl.equip$equipment.name == eq]
)
for.data <- tbl.data %>%
select_(cola = vala,
colb = valb) %>%
mutate(
result = test_func(cola, colb, equip.mult),
fault = test_fail(cola, colb)
)
score <- sum(for.data$fault)/length(for.data$fault)
savings <- sum(for.data$result[for.data$result > 0])
p1 <- ggplot(for.data, aes(x = colb, y = cola, color = as.factor(fault))) +
geom_point() +
annotate("text", label = paste("savings is:", savings), x = 50, y = 60) +
annotate("text", label = paste("score is:", score), y = 51, x = 80) +
ggtitle(paste("Equipment:", eq)) +
theme_minimal()
print(p1)
}
解释
因此,在此示例中,tbl.data
数据框将是我从每个建筑物收到的数据。我必须手动创建tbl.equipment
和tbl.point
数据框,我只能在我的机器或数据库中的* .csv文件中存放(并且能够在Shiny中添加/编辑) 。点名称没有标准,并且不能保证每个设备都有每个点。使用select()
或contains()
等starts_with()
助手是不可能的。
所以我刚刚创建了一个Equipment表,它在设备上有参数(在这种情况下是一个倍数)。此外,还有一个Point表,它告诉每个设备和哪个类别属于哪个类别。
对于这个简单的例子,我包含了两个示例函数。一个根据数据计算一个值,另一个根据故障进行测试。我过去最大的问题是当一台设备没有点时,它会停止执行,所以我必须手动进入并取出它或其他东西。我想解决方法是在运行那段代码之前使用exists()
或类似的东西进行测试。
同样,对于这个简单的例子,我只是打印了一个情节,但输出可能是Markdown文档(我认为我以前做过,但不是这样)或Shiny(我创建了一些更简单的应用程序) )。
结论
最大的问题是“这是”正确的“做法吗?”我敢肯定这是非常常见的,必须有一个我没有使用的非常有效的方法。当我开始编写代码打印报告或将其转换为闪亮的应用程序时,有什么能帮助我取得成功?