Я импортирую некоторые данные из таблицы 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)
})
Это не то, как вы будете использовать 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
).