1

背景

我会收到关于建筑物、大量建筑物和大量设备的设备的每小时间隔报告。设备上的每个参数都称为一个点,它们已经有一个名称,我无法选择点的名称。每个点名称都是唯一的。我正在尝试做的是对每座建筑物运行标准报告。最终,我想把它移到 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.equipmenttbl.point数据框,我只需将它们存放在我的机器或数据库上的 *.csv 文件中(并且能够在 Shiny 中添加/编辑)。点名称没有标准,也不能保证每件设备都有每个点。使用select()诸如contains()or之类的助手starts_with()是不可能的。

所以我刚刚创建了一个设备表,其中包含有关设备的参数(在本例中为倍数)。此外,还有一个点表,它告诉您哪个设备以及每个点属于哪个类别。

对于这个简单的示例,我包含了两个示例函数。一个根据数据计算一个值,另一个测试故障。我过去最大的问题是当一个设备没有点时,它会停止执行,所以我必须手动将其取出或其他东西。我想解决方法是exists()在运行那段代码之前使用或类似的东西并进行测试。

同样,对于这个简单的例子,我只是打印了一个图,但输出可能是 Markdown 文档(我想我以前做过,但不是这样)或 Shiny(我创建了一些更简单的应用程序)。

结论

最大的问题是“这是“正确”的做法吗?我确信这很常见,并且必须有一种我没有使用的非常有效的方法。当我开始编写代码以打印报告或将其放入 Shiny 应用程序时,什么会为我的成功做好准备?

4

0 回答 0