我想运行一个执行时间不到一秒的函数。我想每秒循环运行它。我不想在运行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还有一个我不知道的吗?感谢。
答案 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()