我正在从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"
)
})
})
更新
我完成了想要的工作,但现在有了:
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 :(得分: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
。当前返回当前时间,因此每2分钟运行valueFunc
。你不想那样。
在valueFunc
中,您应该使用廉价的SQL语句ping数据库,以检查感兴趣的表是否已更新:即:return last row =>如果最后一行已更改,{{ 1}}已运行,您的输出(使用valueFunc
)将被更新。