闪亮的reactPoll重用于多个数据库表名称

时间:2018-10-03 21:25:49

标签: r shiny

我有一个仪表板,它依赖于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>)
    ....
    ....
}

注意:我了解我可以将checkFuncvalueFunc移出并使其通用,但是,仍然需要25个以上的reactPoll()定义来调用这两个函数。这就是我要避免的事情。

1 个答案:

答案 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")
}