20  Ejecución de scripts de R desde la terminal

En este capítulo aprenderemos a ejecutar scripts de R directamente desde la terminal, una habilidad esencial para automatizar tareas y trabajar de manera más eficiente. Si bien RStudio y otros entornos gráficos son herramientas poderosas, ejecutar scripts desde la terminal ofrece ventajas importantes, como mayor rapidez, control sobre el entorno y la capacidad de automatizar procesos sin depender de interfaces gráficas. Hacer esto es necesario cuando tenemos que programar alguna tarea de gran escala que se ejecutará de manera remota en algún servidor o cuando necesitamos encapsular nuestro programa para que otros lo puedan correr sin siquiera saber nada de R.

20.1 Requisitos

Para poder ejecutar scripts de R desde la terminal de Windows, necesitamos:

1. Editar la variable de entorno PATH

Cuando queramos correr un programa de R usaremos el comando Rscript. Por default, la terminal lo desconoce, porque se trata de un programa que se agregó en nuestra computadora el día que instalamos R. Por eso necesitamos indicarle al sistema operativo que Rscript es un comando que se instaló con R y que lo puede encontrar en la carpeta de los archivos de instalación del programa R. Esto hay que hacerlo una sola vez por computadora editando las variables de entorno de Windows, que son cadenas de texto que contienen información acerca del sistema. Se logra siguiendo estos pasos:

  1. Fijarse en qué carpeta de la computadora está instalado R. Seguramente lo encuentres si, abriendo el explorador de archivo, vas siguiendo este camino: Este equipo > Windows (C:) > Archivos de programa > R > R-version > bin. En esta carpeta tiene que haber dos archivos, llamados R.exe y Rscript.exe. Si es así, hacé clic con el botón derecho del mouse sobre cualquiera de ellos, luego en “Propiedades” y copiá el path que aparece en “Ubicación” (deberías copiar algo como C:\Program Files\R\R-4.4.3\bin). También podés copiar el path que se ve arriba en la barra de navegación.

    Archivos de instalación de R en Windows.

    Archivos de instalación de R en Windows.
  2. Hacer clic en “Inicio” (logo de Windows de la barra de tareas) o presionar la tecla Windows del teclado, escribir “Entorno” y hacer clic en la opción “Editar las variables de entorno del sistema”.

  3. Hacer clic en el botón “Variables de entorno” (abajo).

  4. En el cuadro “Variables del sistema” (abajo), hacer clic en la variable “Path” y luego en “Editar”.

    Variables de entorno de Windows.

    Variables de entorno de Windows.
  5. Hacer clic en “Nuevo”, pegar la dirección copiada antes (por ejemplo, C:\Program Files\R\R-4.4.3\bin) y dar Enter.

    Editar variable de entorno.

    Editar variable de entorno.
  6. Luego, hacer clic en “Aceptar” tres veces para confirmar y cerrar todo.

2. Abrir la terminal y cambiar el directorio de trabajo

A la hora de ejecutar un script desde la terminal, tenemos que cambiar el directorio de trabajo a la carpeta en la cual está guardado, con el comando cd. Luego, ejecutamos el comando Rscript nombre_archivo.R. Si no queremos cambiar el directorio de trabajo, debemos escribir el path completo hacia el script, pero esto es menos cómodo (por ejemplo: Rscript C:\Users\Documents\nombre_archivo.R).

Los scripts utilizados en los ejemplos de esta unidad pueden ser descargados desde este archivo comprimido y ubicados de forma ordenada en algún lugar de la computadora, idealmente en la carpeta destinada para esta unidad, como se muestra en la siguiente imagen.

Cambio del directorio de trabajo a la carpeta que contiene los scripts de R.

Cambio del directorio de trabajo a la carpeta que contiene los scripts de R.

20.2 Ejecución de programas sin interacción del usuario

Empezaremos con el ejemplo propuesto por el script mi_programa.R que tiene este contenido:

a <- "¡Hola, Mundo!"
b <- 3
d <- 5
cat("==========================================\n")
cat("                 RESULTADOS               \n")
cat("==========================================\n\n")
cat("El valor de b es ", b, ", mientras que d vale ", d, ".\n\n", sep = "")
cat("La suma entre ellos es igual a ", b + d, ".\n\n", sep = "")
cat("Este es un saludo:", a)

Todo lo que en el programa está encerrado en una llamada a la función cat() es lo que se mostrará como mensajes en la terminal cuando el script sea ejecutado. En una terminal abierta y habiendo cambiado el directorio hacia la carpeta donde está guardado el script, utilizamos el comando Rscript mi_programa.R y veremos el siguiente resultado:

Correr el script mi_programa.R desde la terminal.

Correr el script mi_programa.R desde la terminal.

20.3 Ejecución de programas interactivos

Correr scripts desde la terminal nos permite crear programas interactivos, que soliciten información al usuario y actúen en función de esa entrada. Este enfoque es particularmente útil cuando necesitamos que el usuario proporcione datos específicos o haga elecciones durante la ejecución del programa, sin depender de interfaces gráficas complejas. Al usar funciones de R como scan(), podemos diseñar scripts que personalicen su comportamiento según las respuestas del usuario.

Por ejemplo, el script saludo.R preguntará al usuario “¿Cómo te llamás?” y luego responderá con un saludo. Su contenido es:

cat("***************************************\n")
cat("¿Cómo te llamás?\n> ")
nombre <- scan(file = "stdin", what = character(), n = 1, quiet = TRUE)
cat("¡Hola, ", nombre, "!\n", sep = "")
cat("***************************************\n")

La función scan() es la que permite escanear o leer valores que los usuarios ingresen por la terminal. Sus argumentos incluyen:

  • file: especifica desde donde se lee la información. Debemos setearlo como file = "stdin" porque vamos a leer información desde la terminal.
  • what: determina el tipo de dato a leer, generalmente un valor numérico o una cadena de texto. Si queremos leer un número, no es necesario usarlo, ya que por default se tiene what = double() y hace eso. En cambio, si queremos leer texto, como en este ejemplo, debemos indicar what = character().
  • n: cantidad de valores a leer (uno solo en el ejemplo).
  • quiet: valor lógico que determina si la función opera escribiendo detalles adicionales en la consola (FALSE, valor por defecto, no lo desemos) o de forma silenciosa, sin escribir nada adicional (TRUE, es lo que queremos).

Cuando ejecutamos este script, vemos:

Correr el script saludo.R desde la terminal.

Correr el script saludo.R desde la terminal.

Pasamos a otro ejemplo. El siguiente script le pide a la persona que lo esté usando que indique cualquier número y luego le comunica si es par o impar:

cat("==========================================\n")
cat("           PARIDAD DE UN NÚMERO           \n")
cat("==========================================\n\n")
cat("Ingrese un número entero y presione enter:\n")
n <- scan(file = "stdin", n = 1, quiet = TRUE)
if (n %% 2 == 0) {
  cat(n, "es par\n")
} else {
  cat(n, "es impar\n")
}

Esto es lo que ocurre en la terminal:

Correr el script paridad.R desde la terminal.

Correr el script paridad.R desde la terminal.

Ahora recordemos el ejercicio de la práctica 2 en el que escribimos un programa para calcular salarios, en función del día de la semana, el turno y las horas trabajadas. Podemos adaptarlo para esta información de la que depende el cálculo final se tome desde la terminal:

# PROGRAMA: "Determinar salario"

# Valores fijados
valor_hora <- 4000
valor_adicional_noche <- 2000
valor_adicional_domingo <- 1000

# Pedir valores para calcular el salario
cat("Ingrese la cantidad de horas trabajadas:\n")
horas <- scan("stdin", n = 1, quiet = TRUE)
cat("\nIngrese el día de la semana (DOM LUN MAR MIE JUE VIE SAB):\n")
dia <- scan("stdin", what = "", n = 1, quiet = TRUE)
cat("\nIngrese el turno (M T N):\n")
turno <- scan("stdin", what = "", n = 1, quiet = TRUE)

# Cálculo para el pago de ese día a ese empleado
salario <- horas * valor_hora
if (turno == "N") {
  salario <- salario + horas * valor_adicional_noche
}
if (turno == "DOM") {
  salario <- salario + horas * valor_adicional_domingo
}
cat("\nEl salario que se debe abonar es $", salario, "\n", sep = "")

Ejecutamos el script salario.R:

Correr el script salario.R desde la terminal.

Correr el script salario.R desde la terminal.