Suspender la ejecución de un código de R durante un intervalo de tiempo

Introducción a R Control de flujo
La función Sys.sleep()

La función Sys.sleep permite detener la ejecución de un proceso de R durante un intervalo de tiempo, en segundos. Esto es muy útil cuando se ejecuta un bucle for y se necesita ralentizar la velocidad del bucle.

Sintaxis y casos de uso

La función toma como entrada un número positivo que será el número de segundos para suspender la ejecución del código.

Sys.sleep(time)

Esta función tiene varios casos de uso. Algunos de ellos son:

  • Cuando estás haciendo scraping de un sitio web o descargando archivos y no quieres sobrecargar el servidor.
  • Para retrasar la ejecución de algún código.
  • Cuando se quiere reintentar algún código que falló después de algún tiempo (por ejemplo, un servidor está caído y hay que esperar algún tiempo hasta que se levante).
  • Cuando realizas llamadas a una API limitada (por ejemplo, si admite X llamadas por hora).

Usando Sys.sleep dentro de un bucle

Considera el siguiente bucle for en el que para cada iteración imprimimos el tiempo que tarda en ejecutarse:

for(i in 1:5) {
  
  # Hora de inicio
  inicio <- Sys.time()
  
  # Código
  
  # Hora de fin
  fin <- Sys.time()
  
  # Tiempo transcurrido
  tiempo <- fin - inicio
  
  print(tiempo)
  
}
Time difference of 2.861023e-06 secs
Time difference of 1.907349e-06 secs
Time difference of 1.907349e-06 secs
Time difference of 3.099442e-06 secs
Time difference of 9.536743e-07 secs

Cada iteración no tarda casi nada en completarse. Sin embargo, si quieres detener la ejecución un segundo cada iteración puedes utilizar Sys.sleep(1).

for(i in 1:5) {
  
  # Hora de inicio
  inicio <- Sys.time()
  
  Sys.sleep(1)
  
  # Hora de fin
  fin <- Sys.time()
  
  # Tiempo transcurrido
  tiempo <- fin - inicio
  
  print(tiempo)
  
}
Time difference of 1.003335 secs
Time difference of 1.012604 secs
Time difference of 1.014571 secs
Time difference of 1.028076 secs
Time difference of 1.027852 secs

Ahora cada iteración tarda alrededor de 1 segundo más en completarse.

Usando Sys.sleep dentro de un sapply

También puedes utilizar la función Sys.sleep dentro de una función sapply o lapply. En el siguiente ejemplo estamos pausando la ejecución 5 segundos entre iteraciones.

sapply(1:5, function(i) {
  
  Sys.sleep(5)
  
  return(i)
  
})
1 2 3 4 5