2011-01-31 13 views
5

Sto provando a creare una funzione in R che ritorna per i primi x secondi dopo la chiamata di funzione 1, i successivi x secondi 0, i successivi x secondi 1 di nuovo, .. . L'intera procedura dovrebbe fermarsi dopo un altro intervallo di tempo o dopo n iterazioni. Voglio farlo con una chiamata di funzione.Come creare al meglio una funzione timer in R

Ho letto del pacchetto tcltk che apparentemente comporta alcune possibilità di creare tali funzioni "timer", tuttavia non ho trovato abbastanza spiegazioni per risolvere il mio problema.

Potresti consigliarmi dove trovare un buon manuale che spieghi tcl nel contesto con R? Avete altre idee su come creare una tale funzione in modo efficiente?

Grazie mille per il vostro aiuto.

risposta

9

Se ho capito si correttamente, si sta cercando di creare una funzione che restituisce 1 ogniqualvolta è chiamata nei primi x sec , quindi restituisce 0 ogni volta che viene chiamato nei successivi x secondi, quindi restituisce 1 nei successivi x secondi, ecc. E dopo un certo tempo total, dovrebbe essere "fatto", forse restituire -1?

si possa fare ciò utilizzando la seguente funzione che "creare" una funzione con qualsiasi intervallo desiderato:

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

È possibile utilizzare questo per creare una funzione che alterna tra 0 e 1 ogni 10 secondi durante la primi 60 secondi, e restituisce -1 dopo 60 secondi:

> flp <- flipper(10,60) 

Ora chiamando flp() avrà il comportamento che stai cercando, vale a dire quando si chiama flp() durante i prossimi 60 secondi, che si alterneranno tra 1 e 0 ogni 10 sec s, quindi dopo 60 secondi restituirà -1.

+1

Volete 'T0 <- Sys .time', altrimenti modificherai un 't0' in ambito globale e (se già esiste) – hadley

+0

sì, risolto, grazie. –

7

Sys.sleep dalla base non potrebbe essere una soluzione?

Es: arrestare ogni 10 iterazione in un ciclo di 10 secondi:

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

Io non sono chiare su "l'intera procedura dovrebbe fermarsi dopo un altro intervallo di tempo o dopo n iterazioni", vuoi per controllare il tempo trascorso periodicamente durante l'esecuzione della funzione e stop() se è al di sopra di un certo valore?

1

Il comando tcltk richiama una funzione dopo un ritardo. Farlo chiamare ripetutamente può essere fatto seguendo le linee seguenti (reso più complicato da questo desiderio di avere intervalli diversi tra gli eventi).

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

Posso anche suggerire:

Timer 1

library(data.table) 

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

Timer 2

library(matlab) 

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

Entrambe sono scelte eccellenti per i timer