2011-01-31 20 views
5

私は関数呼び出し1の次のx秒0、次のx秒1、再び最初のx秒間返す関数をRで作成しようとしています。 。全体の手順は、別の時間間隔後またはn回の反復後に停止する必要があります。私は1つの関数呼び出しでこれをやりたいRでタイマー関数を作成する方法

私は、しかし、私は私の問題を整理するのに十分な説明を見つけることができませんでした、明らかな「タイマー」機能を作成するためのいくつかの可能性を伴うパッケージtcltkについて読みました。

Rとの関連でtclについて説明する良いマニュアルはどこにありますか?このような関数を効率的に作成する方法は他にもありますか?

ありがとうございました。

答えて

9

:10秒ループ内のすべての10番目の反復を停止、それは次のx秒で呼ばれていたときになど、次のx秒かけて1を返し、その後、0を返し、一定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) 
    } 
} 

あなたは中に0と1の間のすべての10秒を交互に関数を作成するためにこれを使用することができます。

あなたは、任意の所望の間隔で機能を「作成」します次の関数を使ってこれを行うことができます最初の60秒、-1を返し、60秒後に:あなたは、次の60秒の間にflp()を呼び出すとき

> flp <- flipper(10,60) 

は今、あなたが探している振る舞いを持つことになりますflp()を呼び出し、すなわち、それはすべての1と0の間で切り替わります10秒60秒後に-1を返します。私は明確ではないよ

+1

ための優れた選択肢あなたは 'T0 <をしたいです.time'でなければ、グローバルスコープ内の 't0'を修正しますe(既に存在する場合) – hadley

+0

はい、それを修正しました。 –

7

Sys.sleepベースでは解決できませんでしたか?

例:私はあなたが正しく、あなたはそれが最初のx秒で呼び出されるたびに1を返す関数を作成しようとしている理解している場合

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

私も提案してもよい: - のSys

タイマ1

library(data.table) 

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

タイマー2が

library(matlab) 

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

は、両方のタイマ

関連する問題