2011-01-31 3 views
5

J'essaie de créer une fonction dans R qui retourne pendant les premières x secondes après l'appel de fonction 1, les x prochaines 0 secondes, les x secondes suivantes 1 à nouveau, .. .la procédure entière devrait s'arrêter après un autre intervalle de temps ou après n itérations. Je veux faire cela avec un appel de fonction. J'ai lu à propos du paquetage tcltk qui comporte apparemment quelques possibilités pour créer de telles fonctions "timer", mais je n'ai pas trouvé assez d'explications pour résoudre mon problème.Comment créer au mieux une fonction minuterie dans R

Pourriez-vous me conseiller où trouver un bon manuel qui explique tcl dans le contexte de R? Avez-vous d'autres idées pour créer une telle fonction de manière efficace?

Merci beaucoup pour votre aide.

Répondre

9

Si je vous ai bien compris, vous essayez de créer une fonction qui retournera 1 chaque fois qu'il est appelé dans les premiers x secondes , puis retourne 0 à chaque fois qu'il est appelé dans les x secondes suivantes, puis retourne 1 au cours des x secondes suivantes, etc Et après un certain temps, il devrait être "fait", peut-être retourner -1?

Vous pouvez le faire en utilisant la fonction suivante qui « créer » une fonction avec un intervalle souhaité:

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

Vous pouvez l'utiliser pour créer une fonction qui alterne entre 0 et 1 toutes les 10 secondes au cours de la 60 premières secondes, et retourne -1 après 60 secondes:

> flp <- flipper(10,60) 

maintenant appeler flp() aura le comportement que vous cherchez, par exemple lorsque vous appelez flp() au cours des 60 prochaines secondes, alterne entre 1 et 0 tous les 10 sec s, puis après 60 secondes, il retournera juste -1.

+1

Vous voulez 't0 <- Sys .time', sinon vous allez modifier un 't0' dans le scop global e (s'il existe déjà) – hadley

+0

oui, corrigé, merci. –

7

Sys.sleep de base ne pouvait pas être une solution?

Par exemple: arrêter chaque itération 10 dans une boucle pendant 10 secondes:

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

Je ne suis pas clair sur « toute la procédure devrait arrêter après un intervalle de temps ou après n itérations », voulez-vous de vérifier périodiquement le temps écoulé pendant l'exécution de la fonction et stop() si elle est au-dessus d'une certaine valeur?

1

La commande tcltk après appelle une fonction après une temporisation. L'amener à appeler à plusieurs reprises peut être fait le long des lignes suivantes (rendu plus compliqué par ce désir d'avoir différents intervalles entre les événements).

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

Je vous suggère aussi:

minuterie 1

library(data.table) 

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

minuterie 2

library(matlab) 

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

Les deux sont d'excellents choix pour les minuteries

Questions connexes