我如何每秒运行一个函数

时间:2016-03-18 14:11:33

标签: r

我想运行一个执行时间不到一秒的函数。我想每秒循环运行它。我不想在运行main() { struct List Q; Initialize_list(&Q); Insert_it(&Q,12); } void Initialize_list(struct List *L) { L->head=NULL; L->tail=NULL; } 之类的函数之间等待一秒钟。

Sys.sleep

我可以录制一个while(TRUE){ # my function that takes less than a second to run Sys.sleep(runif(1, min=0, max=.8)) # wait for the remaining time until the next execution... # something here } 并在循环中每次迭代进行比较,就像这样......

starttime <- Sys.time()

但我的功能似乎永远不会被执行。

我知道python有一个包来做这种事情。 R还有一个我不知道的吗?感谢。

5 个答案:

答案 0 :(得分:11)

您可以使用system.time

跟踪时间
while(TRUE)
{
    s = system.time(Sys.sleep(runif(1, min = 0, max = 0.8)))
    Sys.sleep(1 - s[3]) #basically sleep for whatever is left of the second
}

您也可以直接使用proc.time(system.time调用),由于某些原因,我可以获得更好的结果:

> system.time(
  for(i in 1:10)
  {
    p1 = proc.time()
    Sys.sleep(runif(1, min = 0, max = 0.8))
    p2 = proc.time() - p1
    Sys.sleep(1 - p2[3]) #basically sleep for whatever is left of the second
  })
   user  system elapsed 
   0.00    0.00   10.02

答案 1 :(得分:8)

以下是一些替代方案:

1)tcltk 在tcltk包中尝试after

library(tcltk)

run <- function () { 
  .id <<- tcl("after", 1000, run) # after 1000 ms execute run() again
  cat(as.character(.id), "\n")    # replace with your code
}

run()

在新的R会话上运行此命令:

after#0 
after#1 
after#2 
after#3 
after#4 
after#5 
after#6 
after#7 
...etc...

要停止tcl("after", "cancel", .id)

2)tcltk2 tcltk2包中的另一种可能性是tclTaskSchedule

library(tcltk2)

test <- function() cat("Hello\n")  # replace with your function
tclTaskSchedule(1000, test(), id = "test", redo = TRUE)

停止:

tclTaskDelete("test")

redo=可以指定它应该运行的次数。

答案 2 :(得分:2)

库(later)通过使用later()递归提供了另一个值得一提的非阻塞替代方法:

print_time = function(interval = 10) {
  timestamp()
  later::later(print_time, interval)
}

print_time()

该示例摘自here

答案 3 :(得分:1)

shiny包有一个函数invalidateLater(),可用于触发函数。看看http://shiny.rstudio.com/gallery/timer.html

答案 4 :(得分:0)

虽然很晚。

作为替代,我们可以使用递归。我不知道您要寻找的解决方案。但是它会定期执行功能。

ssc <-  function(){
x <- rnorm(30,20,2)
print(hist(x))
 Sys.sleep(4)

 ssc()

 }
ssc()