如何将Flexdashboard脚本转换为闪亮的反应式应用程序

时间:2020-03-27 15:01:23

标签: r shiny flexdashboard

我创建了flexdashboard来进行商品性能评估。它运行得非常好,首先,它从数据库查询数据,然后对数据进行操作并最终使其可视化。

问题源于以下事实:我使仪表板具有可伸缩性,对于每个要约,我都会在仪表板上创建一个单独的页面,并且此要约的数量可以更改。基本上,使用遍历所有商品列表中的所有数据集的for循环以编程方式编写仪表板结构的代码。参见下面的代码:

dbhandle <- odbcDriverConnect('')
picker <- sqlQuery(dbhandle, "select * from something") # sql query to get offer names and dates

for (i in 1:nrow(picker)) {                             # for every offer, calculate some statistics and
  offerKey <- picker[i,]$offerName                      # how many eligible users there are
  dateFrom <- picker[i,]$firstTime
  dateTo   <- picker[i,]$lastTime

  subdat <- list(sqlQuery(dbhandle, "select * from something"))  # statistics
  elig   <- sqlQuery(dbhandle, "select * from something")        # eligible users

  subdat[is.na(subdat)] <- 0
  elig[is.na(elig)]     <- 0

  nam <- paste0("offer", i)
  assign(nam, subdat)

  nam2 <- paste0("elig", i)
  assign(nam2, elig)

  rm(list = c('subdat','elig'))
}

O <- NULL                                            # create list of offer datasets

for (u in 1:nrow(picker)) {
  O[u] <- (get(paste0('offer',u)))
  names(O)[u] <- paste0('offer',u)
}

nominal <- unique(picker$offerName)                  # put offer name into character vector

针对不同类型的要约重复相似的代码块,然后像这样合并两个块。

# binder

O       <- append(O, O2)
nominal <- append(as.character(nominal), as.character(nominal2))
labels  <- names(O)

O是所有商品数据集的列表,nominal是它们各自名称的字符向量,labels是商品代码的列表(offer1,{{ 1}}等)。之后是for循环,该循环创建可打印的图形,html值表,几个valueBoxes和表。所有这些对象的名称都像:offer2等...

最后一部分代码是针对仪表板结构的程序化脚本编写(为方便起见,简称此代码)。

offer1_tab

最后,我在R块之外调用out <- lapply(seq_along(labels), function(i) { p1 <- knitr::knit_expand(text = sprintf("\n%s", nominal[i])) p2 <- knitr::knit_expand(text = "\n==================\n") r11 <- knitr::knit_expand(text = "\nRow {data-width=100}") r12 <- knitr::knit_expand(text = "\n------------------\n") a1 <- knitr::knit_expand(text = "\n###") a2 <- knitr::knit_expand(text = "\n```{r}") a3 <- knitr::knit_expand(text = sprintf("\n%s_v1", labels[i])) a4 <- knitr::knit_expand(text = "\n```\n") . . . paste(p1, p2, r11, r12, a1, a2, a3, a4, ... , collapse = '\n') }) 来编织r paste(knitr::knit(text = paste(out, collapse = '\n')))结构。它为我提供了一个不错的静态仪表板。

最后这个问题,如何使该仪表板具有响应性?我希望它在服务器上运行,每n小时刷新一次数据和所有图形内容。通过添加out,我尝试将第一个示例代码用runtime: shiny包围起来是可响应的,但是我得到了 Error:类型为'closure'的对象不可子集。 >

我的直觉是,当我变得闪亮起来使数据无效时,它将每隔n小时重新计算一次。此IMO的问题在于,我是通过迭代创建对象的,然后还要迭代新创建的对象。此外,仪表板结构是迭代构建的,我无法遍历反应式对象。我也尝试过thisthat解决方案,但他们不考虑迭代仪表板结构。

感谢您的帮助或建议,很抱歉,这是一个很长的问题,也请记住这是我的第一个问题,希望示例足够准确。托马斯

0 个答案:

没有答案