Cómo Automatizar Scripts de R en Windows y Mac

Share on linkedin
Share on twitter
Share on email

Cómo automatizar un Script en R

Poder correr un script en tu ordenador. Crear una app Shiny para que otras personas puedan ver los resultados de un análisis a través de una interfaz, también está muy bien. Pero hay algo que aún falta: la automatización de tareas.

¿Te imaginas todo lo que podrías si pudieses hacer que un script se ejecutase automáticamente? Automatización de informes y envío de los mismos, avisos en tiempo real… En definitiva, ahorrarnos todas esas tareas repetitivas que tanto nos aburren y tanto tiempo nos llevan (552 horas al año según este estudio) Suena fantástico, ¿verdad? Pues vamos a ver lo fácil que es conseguirlo. ¡Vamos a por ello!

Pasos Previos

Antes de ponernos con el código, hay que tener en cuenta dos cosas:

  1. El sistema operativo: la forma en la que automatizaremos el Script depende de cuál sea tu sistema operativo. La forma de hacerlo en Mac y Windows es diferente, pero no te preocupes, que explico las dos;)
  2. Fiabilidad: seguramente este no sea el método más fiable para automatizar las tareas, ya que algunas veces puede fallar. Si te gustaría que esto fuese casi infalible, habría otras formas mejores de hacerlo. Como siempre, si te interesa, coméntamelo por LinkedIn y hago un post sobre ello.

Teniendo esto claro, ¡empecemos con la automatización de Scripts de R en Windows!

Cómo Automatizar Scripts de R en Windows

La automatización de tareas la realizaremos con el paquete taskscheduleR. Por lo tanto, lo primero será descargar e instalar este paquete.

#install.packages("taskscheduleR")
library(taskscheduleR)

Una de las cosas buenas de este paquete es que tiene un Addin que nos permitirá realizar la automatización de una forma mucho más fácil. Y, si no conoces los addins de R Studio, este es un buen momento para familiarizarte con ellos 😉

Para abrir el adding lanza la siguiente línea de comando taskscheduleR:::taskschedulerAddin() o sino, puedes encontrarlo en el apartado “Addins” dentro de la barra superior. De cualquiera de los dos modos, se abrirá una ventana como esta:

Como puedes ver, se trata de una pestaña bastante intuitiva. En cualquier caso, te explico qué debes incluir en cada apartado:

  • Choose your RScript: debes elegir el script de R que quieras automatizar.
  • Rscript repo: dónde se copiarán los scripts a automatizar los logs de los mismos.
  • Schedule: cada cúanto quieres que se lance ese Script: una vez al mes, a la semana, al día, cada hora, cada minuto, cada vez que un usuario accede al ordenador, etc.

IMPORTANTE: el script que vayamos a automatizar debe ser autoejecutable, es decir, que no requiera de otros scripts ni datos precargados. Si requiere de otros archivos, es importante definir bien la ruta completa de los mismos, ya que al automatizarlos el working directory cambia.

En mi caso he elegido un Script llamado Automatizar_mtcars.R muy sencillito que simplemente guarda el dataframe mtcars como un csv con el timestamp como nombre. En cualquier caso, eso te podría extender a otros temas, como automatizar un email, o un rmarkdown (o los dos juntos;), por ejemplo.

El script hace lo siguiente:

library(lubridate)
ahora <- Sys.time()
ahora <- gsub(" |:","_",ahora)
write.csv(mtcars,paste0(ahora,"mtcars.csv"))

Ahora vamos a automatizarlo con taskscheduler. En mi caso lo haré mediante código, aunque es lo mismo que hacerlo mediante la pantalla. Básicamente yo prefiero hacerlo así, porque al copiar y pegar código me ahorro tener que cambiar los formatos.

Para ello, tenemos que:

  1. Darle un nombre al task. Como es lógico, es importante que no le des un nombre de una task ya existente.

  2. Ruta del fichero R. Es importante pasar la ruta del fichero completa, sino, no funciona. Para sacar la ruta completa, os recomiendo usar la funcion file.choose, que facilita el proceso.

  3. Decidir desde cuándo y cada cuánto se va a lanzar la tarea.En mi caso, la lanzaré cada minuto.

library(taskscheduleR)
fichero <- "C:\\Users\\Ander\\Desktop\\Automatizar_mtcars.R"

taskscheduler_create(taskname = "mtcars", 
                     rscript = fichero,
                     schedule = "MINUTE", 
                     starttime = format(Sys.time(), "%H:%M:%S"), 
                     startdate = format(Sys.time(), "%d/%m/%Y"))
## [1] "Correcto: se cre¢ correctamente la tarea programada \"mtcars\"."

Y con esto ya estaría nuestro script en R automatizado. ¿Y si lo queremos parar? Pues muy sencillo, básicamente corremos la función taskscheduler_stop con el nombre del task (en mi caos, mtcars). ¿Y si la quieres borrar? Pues usas la función taskscheduler_delete. Y si ni con esas te aclaras, siempre lo puedes hacer desde el adin 😉

Cómo automatizar Scripts de R en Windows listo! Ahora, veámos cómo automatizar Scripts de R en MacOs. ¡Vamos a por ello!

Cómo Automatizar Scripts de R en MacOs

Automatizar un Script de R en MacOs es casi igual de sencillo que hacerlo en Windows. En este caso, usaremos la librería cronR, la cual permite lanzar cronjobs, el sistema que usa MacOs para automatizar tareas. El equivalente de Task Scheduler, vaya.

Empezamos por tanto instalando la librería. Puede ser que la librería no instale ya que necesites tener algún otro paquete instalado, en mi caso, por ejemplo, me pedia instalar shinyFlies. Si es así lo instalamos y debería funcionar sin problema. Vamos a ello:

install.packages("cronR")
library(cronR)

Una vez más para lanzar el cronjob tenemos dos alternativas: el addin que lo podéis lanzar con el comando cron_rstudioaddin() o hacerlo a nivel de código. Os pongo un pantallazo del addin explicando qué es lo que pide:

  • R Script: la ruta del script que queramos automatizar. Una vez más, recuerda pasar la ruta compelta.

  • Fecha y hora de lanzamiento: el día y la hora a la que tiene que empezar el cronjob.

  • Repetición: cada cuánto debe repetirse.

  • Path de la carpeta donde guardar los logs: pues eso, dónde se guardarán los logs y los resultados del cronjob.

En este caso, si queremos hacer el cronjob mediante código, hay que tener en cuenta que este se compone de dos partes. Por un lado, tenemos el comando es el script de R que se va a ejecutar. En esta parte definimos la ruta del script, dónde van los logs, etc. Y, por el otro lado, tenemos la creación del cronjob, en el que decimos desde cuándo y cada cuánto se tiene que ejecutar el script.

Y, como diría Goyo Jiménez, no lo digo, lo hago:

library(cronR)
fichero <- "/Users/afernandez/Desktop/Automatizar_mtcars.R"
cmd <- cron_rscript(fichero)
cron_add(command = cmd, frequency = 'minutely', 
         id = 'prueba', description = 'Descripción del proceso', tags = c('lab', 'xyz'))

Si al ejecutar este comando os devuelve un error (con Mojave y posteriores da este error), seguramente sea porque crontab no tenga acceso completo al disco. Para dárselo, váis a Preferencias del Sistema > Seguridad y Privacidad > Privacidad. Ahí tienes que:

  1. Ir a la pestaña de “Acceso total al disco”.
  2. Desbloquear el candado. Seguramente te pida incluir tu contraseña.
  3. Dar al más para añadir una aplicación.

Una vez hecho esto pulsa comando + shift + G para que se habra la pestaña “Ir a Carpeta” y buscamos la siguiente rua /usr/sbin/cron. Y le damos a ir.

En esta carpeta buscamos el fichero cron y le damos a abrir.

Ahora cron ya tiene acceso total al disco. Ahora falta añadir R y R Studio. Para ello, repetimos el proceso: damos al más, buscamos R.app y lo añadimos y lo mismo para RStudio. El resultado final debe ser este:

Si es así, bloqueamos de nuevo el candado y ya podrás ejecutar tu cronjob sin problema.

Conclusiones

En definitiva, puedes ver cómo automatizar scripts de R en Windows o Mac es muy muy sencillo. Sin embargo, esto abre un mar de posibilidades tremendo: creación de procesos ETL, automatización de informes, sistemas de alertas de control… Todo ello con las opciones que ya ofrece R, como la de conectarse a APIs, subir datos a bases de datos, realizar transformación de los datos…

En definitiva, saber cómo automatizar scripts de R es fundamental para poder evitar hacer todas esas tareas que hacemos de forma repetitiva, que aportan poco valor y que, generalmente, se nos hacen tan aburridas.

Como siempre, cualquier sugerencia, duda o lo que sea, me podéis contactar por LinkedIn. ¡Nos vemos!