Как преобразовать скрипт flexdashboard в блестящее реактивное приложение - PullRequest
0 голосов
/ 27 марта 2020

Я создал 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

...