Как автоматически обновлять блестящее приложение новыми данными? - PullRequest
1 голос
/ 04 октября 2019

Я хочу заставить диаграмму высокого чартера внутри блестящего приложения выводить новые данные из базы данных Mysql. Я пробовал разные подходы, но ни один из них не работает. Сначала я подключаюсь к SQL через библиотеку (RMySQL) и библиотеку (пул) в globalR

#--------Connect to SQL----------#

pool <- dbPool(
  drv = RMySQL::MySQL(),
  dbname = "xxx",
  host = "x.x.x.x",
  username = 'xxxx',
  password = 'xxxx'
)

sql1 <- 'SELECT * FROM `results` WHERE `datetime` >= NOW() - INTERVAL 1 DAY'

query1 <- sqlInterpolate(pool, sql1)

notifier1 <- dbGetQuery(pool, sqlInterpolate(pool,'SELECT * FROM `results` WHERE `datetime` >= NOW() - INTERVAL 1 DAY' ))

lapply(dbListConnections( dbDriver( drv = "MySQL")), dbDisconnect)

, затем я создаю 2 кадра данных

all1 <- as.data.frame(notifier1%>% group_by(datetime, customer) %>% count(ping) %>% filter(datetime > Sys.time()-14400) %>%
             mutate(percent = (round(100 * n/sum(n), 1))) %>% filter(ping=='1') %>% arrange(desc(datetime)))


 all1_new <- transform(all1,datetime=as.numeric(as.POSIXct(datetime))*1000)

На сервере, который я пробовал:

server <- function(input, output, session) {  

     observeEvent(invalidateLater(60000, session),{
             notifier1 <- dbGetQuery(pool, sqlInterpolate(pool,'SELECT * FROM `results` WHERE `datetime` >= NOW() - INTERVAL 1 DAY' ))

             all1 <- as.data.frame(notifier1%>% group_by(datetime, customer) %>% count(ping) %>% filter(datetime > Sys.time()-14400) %>% 
                                        mutate(percent = (round(100 * n/sum(n), 1))) %>% filter(ping=='1') %>% arrange(desc(datetime)))


             all1_new <- transform(all1,datetime= as.numeric(as.POSIXct(datetime))*1000)
     })

и код старшей диаграммы, который мне нужен для отображения новых данных, например, каждые 1 минуту:

output$Plot1 <- renderHighchart ({

        # invalidateLater(60000,session)



    highchart() %>%
         hc_chart(type = "container",
                  zoomType= "x"
         ) %>%
         #axis
         hc_xAxis(type='datetime',
                  # categories=c(min2$datetime),
                  labels = list(rotation = 90,
                                format = '{value:%e-%b %H:%M}'),
                  showLastLabel = TRUE
         ) %>% 
         hc_yAxis(opposite = FALSE, 
                  title = list(text = "Call Success"),
                  labels = list(format = "{value}%", style=list(fontSize='13px')), max = 100) %>% 
         hc_add_series(all1_new, "spline", hcaes(x=datetime, y=percent, group=customer)
         )%>%
      })

1 Ответ

1 голос
/ 04 октября 2019

Это может выглядеть так:

check_db_update <- function() {
  dbGetQuery(pool, sqlInterpolate(pool, 
    'SELECT COUNT(*) FROM `results`' 
  ))
}

get_data_from_db <- function() {
  dbGetQuery(pool, sqlInterpolate(pool,
    'SELECT * FROM `results` WHERE `datetime` >= NOW() - INTERVAL 1 DAY' 
  ))
}

server <- function(input, output, session) {
  data_rx <- 
    reactivePoll(intervalMillis = 6e4, session = session,
                 checkFunc = check_db_update, valueFunc = get_data_from_db)

  data_wrangled_rx <- reactive({
    data_rx() %>% 
      group_by(datetime, customer) %>% 
      count(ping)
    # ...
  })

  output$Plot1 <- renderHighchart ({
    highchart() %>% 
      hc_add_series(data = data_wrangled_rx())
    # ...
  })

  # ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...