闪亮的仪表板数据刷新触发器

时间:2018-08-07 20:56:27

标签: mysql r shiny shinydashboard

我正在从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"
        )
      })
   })

更新

我完成了想要的工作,但现在有了:

    好奇:是否需要为每个不同的查询定义一个新的reactPoll? (例如:reactivePoll函数用于从db获取某个字段,而另一个reactPoll函数用于从db获取整个表)
  • 一个错误:更确切地说,第0列中的无法识别的MySQL字段类型7作为字符导入。我知道这是由于我的表中有时间戳,但我不确定如何处理它们。我看到一种解决方案可能是将其转换为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)
  })

1 个答案:

答案 0 :(得分:0)

我相信您不会这样使用reactivePollreactivePoll就是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。当前返回当前时间,因此每2分钟运行valueFunc。你不想那样。

valueFunc中,您应该使用廉价的SQL语句ping数据库,以检查感兴趣的表是否已更新:即:return last row =>如果最后一行已更改,{{ 1}}已运行,您的输出(使用valueFunc)将被更新。