2011-01-31 60 views
5

我试图在R中创建一个函数,它返回函数调用1后的前x秒,下x秒0,下x秒1再次。整个过程应在另一个时间间隔后或n次迭代后停止。我想用一个函数调用来做到这一点。如何在R中创建一个定时器功能

我读了关于包tcltk,它显然需要创建这样的“计时器”功能的一些可能性,但我没有找到足够的解释来解决我的问题。

你能否告诉我在哪里可以找到一个很好的手册来解释与R语境中的tcl?你有没有其他想法如何以有效的方式创建这样一个功能?

非常感谢您的帮助。

回答

9

如果我理解你正确,你正在试图创建时,它被称为第一个X秒,将返回1的功能,然后在接下来的x秒内调用返回0,然后在接下来的x秒内返回1,等等。在某个total时间之后,它应该是“完成”,也许是返回-1?

你可以做到这一点使用下面的函数,将与任何期望的间隔“创建”的函数:

flipper <- function(interval=10, total = 60) { 
    t0 <- Sys.time() 
    function() { 
    seconds <- round(as.double(difftime(Sys.time(), t0, u = 'secs'))) 
    if(seconds > total) 
     return(-1) else 
    return(trunc(1 + (seconds/interval)) %% 2) 
    } 
} 

可以使用该创建过程中交替每隔10秒0和1之间的函数第60秒,并返回-1 60秒后:

> flp <- flipper(10,60) 

现在呼吁flp()将有你要找的行为,即当你在接下来的60秒称之为flp(),它将在1和0之间交替每10秒秒,那么在60秒后它将返回-1。

+1

你想`T0 < - Sys系统.time`,否则你会在全局scop中修改`t0` e(如果它已经存在) – hadley 2011-01-31 17:56:00

7

Sys.sleep从基地不能解决?

如:停止在一个循环中每10个迭代10秒:

for (i in 1:100) { 
    # do something 
    if ((i %% 10) == 0) { 
     Sys.sleep(10) 
    } 
} 
0
timefun <- function(interval = 10, output = c(0, 1)) { 

    start <- Sys.time() 

    # do some stuff 
    for (i in 1:99999) paste(i, i^2) 

    # how many intervals did it take 
    elapsed <- as.numeric(round(Sys.time() - start))/interval 

    output[elapsed %% length(output) + 1] 
} 

我不清楚的“整个过程应该陆续时间间隔或经过n次迭代停止”,做你想要的功能执行过程中要定期检查经过的时间和stop()如果它超过一定值?

1

之后的tcltk命令将在一段时间后调用一个函数。让它重复调用可以按照以下方法完成(由于这种愿望在事件之间有不同的间隔而变得更加复杂)。

afterID <- "" 
someFlag <- TRUE 
MS <- 5000        # milliseconds 
repeatCall <- function(ms=MS, f) { 
    afterID <<- tcl("after", ms, function() { 
    if(someFlag) {      
     f() 
     afterID <<- repeatCall(MS - ms, f) 
    } else { 
     tcl("after", "cancel", afterID) 
    } 
    }) 
} 
repeatCall(MS, function() { 
    print("Running. Set someFlag <- FALSE to stop.") 
}) 
4

我还建议:

定时器1

library(data.table) 

begin.time <- Sys.time() 
timetaken(begin.time) 

定时器2

library(matlab) 

tic(gcFirst=FALSE) 
toc(echo=TRUE) 

两者都是计时器极好的选择