【问题标题】:Is there an R function to run a piece of code multiple times with 3 seconds interval是否有一个 R 函数可以以 3 秒的间隔多次运行一段代码
【发布时间】:2020-03-10 01:52:47
【问题描述】:

我有一个代码 sn-p 从 MYSQL 数据库表中获取数据。我想继续每 3 秒刷新一次数据框。

library(RMySQL)
library(dbConnect)
library(tictoc)

mydb = dbConnect(MySQL(), user='root', password='password', dbname='test_data', host='localhost')

dbListTables(mydb)

rs = dbSendQuery(mydb, "select * from rawdata")

data = fetch(rs)

View(data)

是否有像“ReactiveFileReader”这样的 R 函数与数据库引擎一起使用?或者请您帮忙编写一个代码 sn-p 以每 3 秒多次运行此代码。谢谢

【问题讨论】:

  • 也许在某个循环中添加一些sleep?(不确定是否有 SQL 原生“计时器”)
  • 嘿@NelsonGon,你认为你可以帮助编写代码 sn-p 吗?
  • 延迟? SQL Server:waitfor delay '00:00:03'; select 1 as a;。 Postgres:select pg_sleep(3), 1 as aMySQL: select sleep(3);.
  • 但也许最好在 R 中处理这个问题,比如while (TRUE) { Sys.sleep(3); dat = dbGetQuery(mydb, "select * from rawdata"); do_something_with(dat); }。 (我在这里假设 DBI,而不是我今天刚刚了解到的 8 岁以上的 dbConnect :-)
  • 如果你想让它自动运行,对我来说假设没有人为交互,所以View 没有意义。一旦每隔几秒钟检索一次数据,您希望如何处理数据?另一个顺便说一句:这是一个 3 秒的暂停,不是每 3 秒检索一次。虽然差异可能是语义上的,但如果您需要严格的 3 秒间隔,那么您将需要更多的逻辑,即使那样您也可能会成为网络延迟的牺牲品。

标签: mysql r shiny


【解决方案1】:

我将改编 shiny::reactiveTimer 中的示例。在我的数据库/实例上测试(不是RMySQL,但足够接近)。

library(DBI)
library(shiny)

ui <- fluidPage(
  tableOutput("mytbl")
)

server <- function(input, output) {
  # Anything that calls autoInvalidate will automatically invalidate
  # every 2 seconds.
  autoInvalidate <- reactiveTimer(3000)

  mydb = dbConnect(RMySQL::MySQL(), user='root', password='password', dbname='test_data', host='localhost')

  mydat <- eventReactive(autoInvalidate(), {
    DBI::dbGetQuery(mydb, "select * from rawdata")
  })

  output$mytbl <- renderTable(mydat())
}

【讨论】:

  • 数据框位于mydat()。你希望它在哪里?
  • 这段代码在我的数据库和表上运行良好。
  • 如果我需要将 mydat 放入环境选项卡下可见的数据框中。我怎样才能做到这一点 ?请
  • 虽然通常不鼓励这样的范围违反,但您可以使用 assign 将变量分配给其他环境(例如 .GlobalEnv)。
  • 好的,我会很感激一个代码 sn-p pls。这有点令人困惑
【解决方案2】:

您可以做的一件事是让函数每隔 n 次延迟运行一次,但问题是每次复制都会存储数据,因此它很快就会变得非常大:

f <- function(){
    Sys.sleep(3)#delay time here
    mydb = dbConnect(MySQL(), user='root', password='password', dbname='test_data', host='localhost')
    dbListTables(mydb)
    rs = dbSendQuery(mydb, "select * from rawdata")
    fetch(rs)
}

# use replicate to run the function n times with delay time
data <- replicate(10, f())

我们将获得所有延迟查询的向量或向量矩阵形式的数据。

【讨论】:

  • 这里有两件事不完整(并且在OP中不完整):(1)数据库连接(mydb)每次都实例化但从未关闭;和(2)结果(rs)应该用dbClearResult清除,或者dbSendQuery应该用dbGetQuery替换(不需要fetch)。
猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多