我有一个仪表板,它依赖于25个以上的数据库表。我想定期刷新此数据。闪亮的reactivePoll
可以检查每个表的行数,然后在行数增加时读取表,这是我的正确选择。
但是,我不想编写25个以上的reactivePoll
方法,每个表一个。相反,我想定义一个“通用”并通过简单地提供数据库表名称来重复使用它。
我找不到办法。有任何想法吗?从概念上讲,这就是我想要的:
pollData <- reactivePoll(60000, session,
checkFunc = function() {
dbconn <- dbConnect(MySQL(), group = 'mysql')
query <- dbSendQuery(dbconn,
'
SELECT
MAX(timeCreated) as lastCreated
FROM
<table name passed as argument>;
')
lastFeedback <- dbFetch(query, -1)
dbClearResult(query)
dbDisconnect(dbconn)
lastFeedback$lastCreated
},
# This function returns the content of the logfile
valueFunc = function() {
dbconn <- dbConnect(MySQL(), group = 'mysql')
query <- dbSendQuery(dbconn,
'
SELECT
*
FROM
<table name passed as argument>
')
data <- dbFetch(query, -1)
dbClearResult(query)
dbDisconnect(dbconn)
data
}
)
server <- function(input, output, session) {
table1Data <- pollData(<table1 name>)
table2Data <- pollData(<table2 name>)
....
....
}
注意:我了解我可以将checkFunc
和valueFunc
移出并使其通用,但是,仍然需要25个以上的reactPoll()定义来调用这两个函数。这就是我要避免的事情。
答案 0 :(得分:1)
我在这个问题上找到了更一般的答案:Create a reactive function outside the shiny app
它引用:https://shiny.rstudio.com/articles/modules.html我相信您正在尝试构建一个闪亮的模块。在您的情况下,它可能类似于以下内容(该函数称为反应函数):
my.reactivePoll <- function(session, table_name, timeout = 60000)
{
my.dataframe <- reactivePoll(timeout, session,
checkFunc = function() {
lastFeedback <- "testValue"
# checking logic here
lastFeedback
},
# This function returns the content of the logfile
valueFunc = function() {
data <- paste0("New value", table_name)
# value logic here
data
})
my.dataframe
}
然后在服务器函数中进行调用,提供table_name
server <- function(input, output, session) {
table1Data <- my.reactivePoll(session, "table1")
table2Data <- my.reactivePoll(session, "table2")
}