2011-01-31 23 views
5

Estoy tratando de crear una función en R que regrese durante los primeros x segundos después de la llamada de función 1, la siguiente x segundos 0, la siguiente x segundos 1 otra vez, .. .el procedimiento completo debe detenerse después de otro intervalo de tiempo o después de n iteraciones. Quiero hacer esto con una llamada de función.Cómo crear mejor una función de temporizador en R

He leído sobre el paquete tcltk que aparentemente implica algunas posibilidades para crear tales funciones de "temporizador", sin embargo, no encontré suficientes explicaciones para resolver mi problema.

¿Podría recomendarme dónde encontrar un buen manual que explique tcl en contexto con R? ¿Tiene otras ideas sobre cómo crear dicha función de manera eficiente?

Muchas gracias por su ayuda.

Respuesta

9

Si le he entendido correctamente, usted está tratando de crear una función que devolverá 1 cuando se le llama en los primeros x segundos , luego devuelve 0 cada vez que se invoca en los siguientes x segundos, luego devuelve 1 durante los siguientes x segundos, etc. Y después de un cierto tiempo de total, se debe "terminar", ¿tal vez devolver -1?

Usted puede hacer esto mediante la siguiente función que va a "crear" una función con cualquier intervalo deseado:

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

Usted puede usar esto para crear una función que alterna entre 0 y 1 cada 10 segundos durante el primeros 60 segundos, y devuelve -1 después de 60 segundos:

> flp <- flipper(10,60) 

Ahora llamando flp() tendrá el comportamiento que usted está buscando, es decir, cuando se llama a flp() durante los próximos 60 segundos, que se alternarán entre 1 y 0 cada 10 segundos s, luego después de 60 segundos, simplemente devolverá -1.

+1

¿Quieres 't0 <- Sys .time', de lo contrario, modificará un 't0' en scop global e (si ya existe) – hadley

+0

sí, lo arregló, gracias. –

7

Sys.sleep de base no podría ser una solución?

Ej: parar cada décima iteración de un bucle de 10 segundos:

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

No me queda claro en "todo el procedimiento debe detenerse después de otro intervalo de tiempo o después de n iteraciones", es lo que desea comprobar el tiempo transcurrido periódicamente durante la ejecución de la función y stop() si es por encima de un cierto valor?

1

El comando tcltk después llamará a una función después de un retraso de tiempo. Hacer que llame repetidamente se puede hacer a lo largo de las siguientes líneas (hecho más complicado por este deseo de tener diferentes intervalos entre eventos).

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

Puedo también sugieren:

temporizador 1

library(data.table) 

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

temporizador 2

library(matlab) 

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

Ambos son excelentes opciones para temporizadores

Cuestiones relacionadas