2011-01-31 20 views
5

Próbuję utworzyć funkcję w R, która zwraca przez pierwsze x sekund po wywołanie funkcji 1, następne x sekund 0, następne x sekund 1 ponownie, .. cała procedura powinna zostać zatrzymana po innym interwale czasowym lub po n iteracjach. Chcę to zrobić z jednym wywołaniem funkcji.Jak najlepiej utworzyć funkcję Timer w R

Przeczytałem o pakiecie tcltk, który najwyraźniej pociąga za sobą pewne możliwości tworzenia takich funkcji "timera", jednak nie znalazłem wystarczających wyjaśnień, aby rozwiązać mój problem.

Czy możesz mi doradzić, gdzie znaleźć dobry podręcznik wyjaśniający tcl w kontekście R? Czy masz inne pomysły, jak stworzyć taką funkcję w skuteczny sposób?

Bardzo dziękuję za pomoc.

Odpowiedz

9

Gdybym rozumieć poprawnie, próbujesz stworzyć funkcję, która zwróci 1, kiedy to się nazywa w pierwszych x sekund , następnie zwróć 0, gdy zostanie wywołana w następnych x sekundach, następnie zwróć 1 przez następne x sekund, itd. A po pewnym czasie total powinno być "zrobione", może wrócić -1?

Można to zrobić przy użyciu następującej funkcji, która będzie „stworzyć” funkcję z dowolnym przedziale:

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) 
    } 
} 

Można to wykorzystać, aby utworzyć funkcję, który zmienia się od 0 do 1 co 10 sek podczas pierwsze 60 sekund i powraca -1 po 60 sekundach:

> flp <- flipper(10,60) 

teraz nazywając flp() będzie mieć zachowanie, którego szukasz, to znaczy kiedy zadzwonić flp() ciągu następnych 60 sekund, to będzie się zmieniać między 1 i 0 każde 10 sekund s, następnie po 60 sekundach po prostu wróci -1.

+1

Chcesz 't0 <- Sys .time', w przeciwnym razie zmodyfikujesz 't0' w globalnym scop e (jeśli już istnieje) – hadley

+0

tak, poprawiono, dzięki. –

7

Sys.sleep z bazy nie może być rozwiązaniem?

Np: stop co 10 iteracji w pętli przez 10 sekund:

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] 
} 

nie jestem jasno „cała procedura powinna zatrzymać po innym przedziale czasowym lub po n iteracjach”, chcesz sprawdzić, jaki upłynął czas okresowo w trakcie wykonywania funkcji i stop() jeśli jest powyżej określonej wartości?

1

Polecenie tcltk after wywoła funkcję po pewnym czasie. Uzyskanie tego w celu wielokrotnego wywoływania może odbywać się wzdłuż następujących linii (komplikuje to pragnienie posiadania różnych odstępów między zdarzeniami).

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

mogę także zaproponować:

timera 1

library(data.table) 

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

timera 2

library(matlab) 

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

Obie są doskonałym wyborem dla timerów