Я создал flexdashboard для оценки эффективности предложения. Он работает очень хорошо, во-первых, он запрашивает данные из базы данных, затем данные обрабатываются и, наконец, визуализируются.
Проблема заключается в том, что я сделал масштабируемую панель мониторинга, для каждого предложения, в котором я создаю отдельную страницу в панель инструментов и это количество предложений может измениться. В основном, код для структуры панели инструментов написан программно с использованием for для l oop, перебирая все наборы данных в списке всех предложений. См. Код ниже:
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
, offer2
и т. д. c.). После этого получается l oop, который создает график, таблицу значений html, несколько ящиков значений и шкалы. Все эти объекты имеют такие имена, как: offer1_tab
et c ...
Последний кусок кода - это програматический c сценарий, пишущий для структуры панели мониторинга (сокращен, чтобы дать вам представление).
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')))
за пределами блока R, чтобы связать структуру out
. Это дает мне хорошую статистическую панель c.
Наконец на вопрос как сделать эту панель реагирующей? Я бы хотел, чтобы она работала на сервере. , обновление данных и всего графического c контента каждые n часов. Добавляя runtime: shiny
, я попытался обернуть первый пример кода с помощью MyData <- reactive({invalidateLater(100000, session) . . . })
, чтобы он был реактивным, но я получил Ошибка: объект типа 'closure' не может быть поднабором .
My Интуиция заключалась в том, что, когда я становлюсь блестящим, чтобы сделать данные недействительными, они будут пересчитывать их каждые n часов. Проблема с этим IMO заключается в том, что я создаю объекты итерациями, а затем я повторяю и вновь созданные объекты. Также структура панели мониторинга строится итеративно, и я не могу перебирать реактивные объекты. Я также попробовал это и это решение, но они не учитывают итеративную структуру панели мониторинга.
Спасибо за любую помощь или предложения, я сожалею, что это очень длинный вопрос, также имейте в виду, что это мой первый вопрос, надеюсь, пример достаточно точный. Tomas