我创建了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的问题在于,我是通过迭代创建对象的,然后还要迭代新创建的对象。此外,仪表板结构是迭代构建的,我无法遍历反应式对象。我也尝试过this和that解决方案,但他们不考虑迭代仪表板结构。
感谢您的帮助或建议,很抱歉,这是一个很长的问题,也请记住这是我的第一个问题,希望示例足够准确。托马斯