2011-01-31 59 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) 

兩者都是計時器極好的選擇