Блестящий триггер обновления данных на приборной панели

0

Я импортирую некоторые данные из таблицы MySQL, но пока для проверки обновлений данных я просто перезаряжал приложение. Я бы хотел, чтобы это произошло динамически, но я не уверен, как реализовать функцию invalidateLater в моем коде, или если я даже поеду за ней, потому что я вижу людей, рекомендующих ReactivePoll. В основном я получаю данные в свою базу данных с 5 до 5 минут, и я хочу также проверить базу данных в определенном интервале и обновить номер, указанный в моей ячейке значений.

Спасибо!

     shinyServer(function(input, output, session) {

      conn <- dbConnect(RMySQL::MySQL(), 
                        dbname="db", 
                        host="localhost", 
                        user="root", 
                        password="password")

      table<- dbReadTable(conn = conn, name ='table1', value= as.data.frame(table))

      prd_number <- dbFetch(dbSendQuery(conn, "SELECT obj FROM table1 ORDER BY id DESC LIMIT 1"))


      output$prdnumber <- shinydashboard::renderValueBox({
        shinydashboard::valueBox(prd_number, "Number of products", icon=icon("tags"), color="purple"
        )
      })
   })

ОБНОВИТЬ

Я выполнил то, что хотел, но теперь у меня есть:

  • Любопытство: необходимо ли определить новый реактивный пакет для каждого другого запроса? (например: функция reactivePoll для получения определенного поля из db и другая реактивная функция Poll для получения всей таблицы из db)
  • ошибка: более точно непризнанный тип поля MySQL 7 в столбце 0, импортированный как символ. Я знаю, это связано с тем, что у меня есть временные метки в моем столе, но я не уверен, как с ними бороться. Я видел, что одним решением может быть преобразование его в временную метку UNIX, но я хочу напечатать дату на панели инструментов, чтобы это не было хорошим выбором.

server.R

  prd_number <- reactivePoll(20000, session, checkFunc = function(){  

  conn <- dbConnect(RMySQL::MySQL(), 
                    dbname="db", 
                    host="localhost", 
                    user="root", 
                    password="password")

  val1 <- dbGetQuery(conn, "SELECT obj FROM table ORDER BY id DESC LIMIT 1")

  val2 <- dbGetQuery(conn, "SELECT date FROM table ORDER BY id DESC LIMIT 1")

  output$prdnumber <- shinydashboard::renderValueBox({
    shinydashboard::valueBox(val1, "Number of items", icon=icon("tags"), color="purple"
    )
  })

  output$update <- shinydashboard::renderValueBox({
    shinydashboard::valueBox(val2, "Last update", icon=icon("tags"), color="lime"
    )
      })
 dbDisconnect(conn)
  })
  • 0
    это может помочь: stackoverflow.com/questions/41424045/…
  • 0
    @MLavoie большое спасибо за ответ. Я приближаюсь к тому, чего хочу, но, к сожалению, у меня все еще есть ошибки.
Показать ещё 2 комментария
Теги:
shiny
shinydashboard

1 ответ

0

Это не то, как вы будете использовать reactivePoll я считаю, reactivePoll, хорошо reactive.

reactivePoll запускает checkFunc на каждом intervalMillis, если checkFunc возвращает другое значение, чем ранее, тогда valueFunc.

Также никогда не обновляйте свой output внутри своих реактивных веществ, перемещайте их за пределы реактивного.

server <- function(input, output, session){
  prd_number <- reactivePoll(
    20000, # checkFunc is ran very 2 min
    session,
    checkFunc = function(){
      Sys.time() ## CHANGE THIS (see below)
    },
    valueFunc = function(){
      conn <- dbConnect(
        RMySQL::MySQL(), 
        dbname="db", 
        host="localhost", 
        user="root", 
        password="password"
      )

      val1 <- dbGetQuery(conn, "SELECT obj FROM table ORDER BY id DESC LIMIT 1")

      val2 <- dbGetQuery(conn, "SELECT date FROM table ORDER BY id DESC LIMIT 1")

      dbDisconnect(conn)
      return(list(val1 = val1, val2 = val2)) # return both values
    }
  )

  output$prdnumber <- shinydashboard::renderValueBox({
    shinydashboard::valueBox(prd_number()$val1, "Number of items", icon=icon("tags"), color="purple")
  })

  output$update <- shinydashboard::renderValueBox({
    shinydashboard::valueBox(prd_number()$val2, "Last update", icon=icon("tags"), color="lime")
  }) 
}

В приведенном выше checkFunc измените checkFunc. В настоящее время он возвращает текущее время, поэтому каждые 2 минуты valueFunc. Вы этого не хотите.

В valueFunc вы должны ping базы данных с помощью дешевого оператора SQL, чтобы проверить, обновлена ли таблица (-ы) интереса: ie: return last row =>, если последняя строка была изменена, valueFunc и ваши выходы (которые используют prd_number).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню