2 USO DE R
2.1 Como calculadora
Sin que se requiera ningún tipo de preparación o ajuste, es posible empezar a usar R, a manera de calculadora, utilizando los operadores aritméticos básicos (+
, –
, *
, /
, ^
). Basta con escribir la operación en la línea de comandos de la consola8 y presionar Enter. En caso de que la expresión escrita esté conformada por más de dos términos y/o factores, se mantienen las prelaciones usuales, pudiendo, asimismo, usarse paréntesis.
5 + 12
#> [1] 17
2 * 9 - 4^2
#> [1] 2
2 * (9 - 4)^2
#> [1] 50
Cuando se realizan operaciones como las ilustradas anteriormente, los espacios que se incluyan o dejen de incluirse no afectan la ejecución. La manera de escribir las instrucciones es cuestión de estilo (cf. capítulo 22).
2.2 Funciones básicas
En adición a los operadores básicos, R incorpora gran cantidad de funciones. Todas las funciones en R tienen el formato función(argumentos)
. Así, por ejemplo, si se desea obtener el logaritmo natural de 2.71, se escribe en la consola: log(2.71)
; al presionar la tecla Enter, se obtiene el resultado 0.9969486
. Entre las funciones matemáticas básicas más comunes, se destacan abs
, sqrt
, log
y exp
.
Vale la pena anotar que, aunque la mayoría de los nombres de las funciones en R son muy nemotécnicos, se trata, desde luego, de una nemotecnia basada en el idioma inglés. Teniendo esto presente, es fácil entender y recordar de dónde proviene, por ejemplo, el nombre para la función que extrae la raíz cuadrada: square root: sqrt
.
2.3 Separador decimal
R siempre usa el punto como separador decimal, independientemente de la configuración local del equipo. Podría pensarse que, si un equipo está configurado con la coma como separador decimal, la función log(2,71)
arrojaría el logaritmo natural de 2.71; no obstante, el resultado obtenido es el logaritmo de 2 en base 71 (sección 2.4).
Puesto que en español, tanto la coma como el punto son separadores decimales válidos9, se recomienda configurar el sistema para que use el punto como separador decimal. Así quedará unificado que se le da en R y el de programas como Excel.
2.4 Argumentos de las funciones
Los argumentos son los insumos, entradas o parámetros operacionales de las funciones. Estos van dentro del paréntesis que sigue al nombre de la función, separados por comas. Pueden ser obligatorios, en cuyo caso tienen que ser suministrados por el usuario, o implícitos, caso en el que tomarían un valor por defecto, siempre que el usuario no especificara algún otro valor. La función logaritmo tiene dos argumentos: log(x, base = exp(1))
, siendo x
un argumento obligatorio, correspondiente al número o vector al que se le aplicará la función logaritmo, y base
, un argumento implícito, cuyo valor por defecto es la constante de Napier (2.7182818…). Al escribir log(2.71)
, se toma 2.71
como argumento principal, y se usa el valor por defecto (la base del logaritmo natural) para el segundo argumento. Al escribir log(2,71)
, se toma 2
como argumento principal y 71
como la base.
Cada uno de los argumentos de una función tiene un nombre y una posición. Al momento de invocar la función, el usuario puede alterar la posición de los argumentos, siempre que se especifique su nombre. Si se respeta la posición predeterminada, podrá omitirse el nombre de los argumentos al invocar la función.
Considérese la función binom.test
, la cual realiza inferencia sobre una proporción binomial. Esta función tiene 5 argumentos, los cuales están definidos en el siguiente orden:
- Argumento 1:
x
, que representa el número de éxitos y no trae ningún valor por defecto.
- Argumento 2:
n
, que representa el número de ensayos Bernoulli y no tiene ningún valor por defecto.
- Argumento 3:
p
, que representa el valor hipotético del parámetro p para la prueba de hipótesis. Por defecto es0.5
.
- Argumento 4:
alternative
, que representa el tipo de prueba, pudiendo ser de dos colas ("two.sided"
, valor por defecto), de cola izquierda ("less"
) o de cola derecha ("greater"
).
- Argumento 5:
conf.level
, que representa el nivel de confianza para el correspondiente intervalo. Por defecto es0.95
.
Cada uno de los cinco argumentos de la función binom.test
tiene un nombre y una posición predeterminada. Los dos primeros son obligatorios, mientras que los tres restantes traen valores por defecto.
Para ilustrar diversas posibilidades, en cuanto al uso de los argumentos, supóngase que se desea utilizar la función binom.test
, para realizar inferencia sobre el parámetro poblacional p, tomando como base un ensayo binomial de tamaño n = 200, en el que se obtuvieron x = 185 éxitos y que se desea contrastar un juego de hipótesis, cuya alternativa postula que el parámetro p es mayor que 0.9 (prueba de cola derecha), generando un intervalo de confianza del 95 %.
Para tal efecto, debe suministrarse la información de los argumentos x
y n
, que no traen valores por defecto. También es necesario suministrar la información de los argumentos p
y alternative
, puesto que los valores por defecto no corresponden con lo requerido en el presente proceso inferencial. Puesto que el valor por defecto de conf.level
sí coincide con el requerimiento, podría omitirse la especificación de este argumento. Cualquiera de las siguientes instrucciones es válida y da lugar al mismo resultado.
binom.test(x = 185, n = 200, p = 0.9, alternative = "greater",
conf.level = 0.95)
binom.test(185, 200, 0.9, "greater", 0.95)
binom.test(185, 200, 0.9, "greater")
binom.test(alternative = "greater", p = 0.9, n = 200, x = 185)
binom.test(185, 200, alternative = "greater", p = 0.9)
Asimismo, es posible usar solo alguna o algunas de las letras iniciales del nombre del argumento, siempre que tales abreviaciones conduzcan unívocamente a un único argumento. Para el ejemplo anterior, podría usarse alguna de las siguientes instrucciones:
binom.test(conf = 0.95, alt = "greater", x = 185, n = 200, p = 0.9)
binom.test(185, 200, a = "greater", c = 0.95, p = 0.9)
Más allá de las múltiples posibilidades que se tiene para invocar una función y del hecho de que, siempre que se sigan las reglas indicadas anteriormente, R la lea y ejecute adecuadamente, es recomendable manejar un formato uniforme y ordenado, que facilite la lectura y depuración por parte del usuario. En tal sentido, debe procurarse por mantener el orden preestablecido de los argumentos y utilizar las etiquetas necesarias para su comprensión.
El orden de los argumentos refleja la importancia que los desarrolladores le otorgan a estos al momento de escribir la función. Los argumentos obligatorios siempre aparecen al comienzo de la función; al final están los argumentos optativos, los cuales asumen por defecto los valores más usuales.
La escritura u omisión del nombre de los argumentos depende del nivel de familiaridad del usuario con la función. Una instrucción como la que se presenta a continuación resultará suficientemente clara para la mayoría de los usuarios que deseen realizar inferencia sobre una proporción binomial:
binom.test(185, 200, p = 0.9, "greater")
Las ayudas de las funciones presentan los detalles relativos a sus argumentos: nombre, posición, valores por defecto, formato de entrada, etc. (capítulo 7).
2.5 Mayúsculas y minúsculas
R diferencia entre mayúsculas y minúsculas; consecuentemente, a
y A
representarán distintos objetos. Asimismo, las funciones tienen una manera particular de escribirse, la cual debe respetarse. Por tanto, si se escribe Log(2.71)
, se obtiene un mensaje de error, en lugar del logaritmo natural de 2.71. La mayoría de las funciones en R se escriben con minúscula; no obstante, esta no es una regla, habiendo funciones, como View
, que se escriben con mayúscula. En otras ocasiones, la función pude combinar mayúsculas y minúsculas, como en TukeyHSD
o leveneTest
.
2.6 Resultados en consola
Cuando el contenido de un vector (cf. sección 8.1) es desplegado en la consola, aparecen indicadores de la posición de sus elementos. Tales indicadores están ubicados en la parte izquierda y van entre corchetes.
Considérense 100 números aleatorios de la distribución Poisson (cf. sección 17), con media \(\lambda\) igual a 130.
rpois(n = 100, lambda = 130)
Se obtiene el siguiente resultado.
#> [1] 113 122 119 102 126 128 131 116 115 122 128 121 140 147 141 126 152 141
#> [19] 126 138 125 131 131 134 137 153 123 137 138 136 126 139 118 143 122 111
#> [37] 115 118 129 126 129 128 135 153 118 123 115 134 146 143 147 134 134 131
#> [55] 120 105 134 132 141 136 132 142 127 115 135 112 130 115 130 149 134 122
#> [73] 142 123 136 123 140 131 141 126 111 127 122 130 150 123 123 127 135 126
#> [91] 130 123 118 116 119 128 132 143 128 137
El contenido del vector resultante se ajusta al ancho de la consola. En la presente ilustración, la consola despliega 18 elementos a lo ancho. El valor entre corchetes que aparece encabezando la primera fila indica que 113 es el primer elemento del vector. El valor entre corchetes que aparece en las filas subsiguientes indica la posición que el elemento inicial de cada fila ocupa en el vector. Así, 126 ocupa la posición 19; 115, la posición 37, y 130 ocupa la posición 91. Si todos los elementos del vector cupieran en una sola fila, únicamente aparecería el indicador [1]; esto es lo usual para resultados que constan de un único valor, como los que se generaron en la sección 2.1.
2.7 Secuencias
La función seq
permite generar secuencias numéricas. El primer argumento (from
) indica el primer número de la serie. El segundo argumento (to
) indica el final de la serie. Por defecto, se utilizan intervalos de 1 (by = 1
).
seq(3, 8)
#> [1] 3 4 5 6 7 8
seq(15, 40, 5)
#> [1] 15 20 25 30 35 40
seq(0, 1, 0.2)
#> [1] 0.0 0.2 0.4 0.6 0.8 1.0
seq(10, 2, -2)
#> [1] 10 8 6 4 2
seq(0.5, 4)
#> [1] 0.5 1.5 2.5 3.5
Si se usa un único argumento para la función, se asume que se trata del segundo argumento (to
); en tal caso, el primer argumento (from
) toma el valor de 1.
seq(5)
#> [1] 1 2 3 4 5
El operador “dos puntos” (:
) utilizado entre dos números equivale a la función seq
, en su forma básica, es decir, con el valor por defecto para los intervalos (by = 1
).
5:8
#> [1] 5 6 7 8
Mediante el argumento length.out
es posible generar una secuencia, especificando el número de valores de la serie, de manera que la longitud del intervalo se calcule automáticamente.
seq(0, 100, length.out = 5)
#> [1] 0 25 50 75 100
2.8 Repeticiones
La función rep
permite repetir el primer argumento de la función. El segundo argumento (times
) especifica el número de repeticiones.
rep(5, 3)
#> [1] 5 5 5
También puede repetirse una secuencia.
rep(2:5, times = 3)
#> [1] 2 3 4 5 2 3 4 5 2 3 4 5
La instrucción anterior da lugar a la repetición de la secuencia completa tres veces. En contraste, el argumento each
permite repetir cada uno de los elementos de la secuencia un número determinado de veces.
rep(2:5, each = 3)
#> [1] 2 2 2 3 3 3 4 4 4 5 5 5
Cuando se utilizan simultáneamente los argumentos each
y times
, se realizan primero las repeticiones de los elementos (each
veces) y luego se repite dicha secuencia (times
veces), sin importar el orden en que se escriban estos argumentos.
2.9 Asignaciones
En R es posible fijar en el ambiente de trabajo cualquier valor, cadena de caracteres o resultado, para su uso posterior, mediante el operador de asignación (<-
)10.
a <- 13
b <- 5
c <- (a - b) * 2
print(c)
#> [1] 16
sp <- "magnirostris"
nchar(sp)
#> [1] 12
Aunque es menos común, también podría realizarse una asignación de izquierda a derecha, así:
13 -> a
También podría usarse la función assign
, la cual es aun menos común.
assign("a", 13)
Merece una mención especial el símbolo de igualdad (=
) como operador de asignación.
a = 13
Aunque en muchas ocasiones el símbolo de igualdad (=
) cumple la misma funcionalidad que el operador de asignación (<-
), hay casos, al evaluar expresiones complejas, en los que solo está permitido el uso del operador de asignación (<-
), no siendo válido el símbolo de igualdad (=
). En adición, por razones de estilo, se aconseja usar siempre el operador de asignación (<-
), reservando el símbolo de igualdad (=
) para la definición de los argumentos dentro de las funciones (cf. capítulo 22).
2.10 Instrucciones
Se le denomina genéricamente instrucción al conjunto de caracteres y/o símbolos que al ser ejecutado realiza un proceso. Por lo general, las instrucciones están conformadas por asignaciones y/o funciones. Al escribir una instrucción es imprescindible respetar la escritura exacta, en lo concerniente al uso de las mayúsculas y las minúsculas. Aunque no hay ninguna restricción en lo que a espacios en blanco se refiere, siendo posible insertar cuantos espacios en blanco se desee (o ninguno), sin que esto afecte la instrucción, existen ciertas convenciones de estilo que es recomendable seguir para hacer el código más legible (cf. sección 22).
Es común —aunque no necesario— que cada instrucción ocupe una línea. No obstante, cuando la instrucción es muy extensa, es posible partirla en dos o más líneas, sin que por ello deje de considerarse una instrucción. A pesar de que hay bastante flexibilidad en cuanto al sitio por el que puede partirse una instrucción, es necesario observar un par de restricciones.
No puede partirse ninguna palabra, ni aun cuando se trate de dos o más palabras unidas mediante un símbolo (p. e., el punto). Esta restricción también incluye las cadenas de caracteres encerradas entre comillas.
La primera línea debe contener como mínimo el nombre de la función y el paréntesis de apertura, en caso de tratarse de una función, o el nombre del objeto y el operador de asignación, en caso de tratarse de una asignación.
2.10.1 Particiones correctas de instrucciones
peso.160 <-
predict(modelo, newdata = data.frame(edad = 160),
interval = "confidence", level = 0.99)
plot(
peso ~ edad, data = reg, main =
"Modelo ajustado")
2.10.2 Particiones incorrectas de instrucciones
peso.
160 <- predict(modelo, newdata = data.frame(edad = 1
60), interval = "confidence", level=0.99)
plot
(peso ~ edad, data = reg, main = "Modelo
ajustado")
Aunque es posible escribir más de una instrucción por línea, separándolas con punto y coma (;
), se desaconseja esta práctica. En pro de la legibilidad, se recomienda separar las instrucciones con saltos de línea.
2.11 Scripts
A no ser que se use R para ejecutar una tarea muy puntual (una operación matemática, por ejemplo), una sesión de trabajo implica la ejecución de múltiples instrucciones. En tales casos, es mucho más práctico organizar las instrucciones necesarias en un archivo que digitarlas una a una en la consola. Al conjunto de instrucciones utilizado para la realización de una tarea se le denomina script. Los scripts en R se guardan en archivos de texto con extensión R. La interfaz gráfica de RStudio facilita la creación, carga y edición de scripts. Estos aparecen por defecto en el panel superior izquierdo.
2.12 Ejecución de instrucciones
En general, en R las instrucciones se ejecutan una a una, de manera secuencial, lo que facilita la depuración de los scripts, al permitir verificar las acciones realizadas por cada instrucción.
Cuando se trabaja en modo interactivo, es decir, desde la consola, basta con escribir la instrucción y presionar la tecla Enter para que se ejecute la correspondiente instrucción. Si se presiona Enter antes de haber escrito la instrucción completa, aparecerá un símbolo de suma (+
), que indica la necesidad de completarla. En tales casos, la tecla Enter actúa partiendo la instrucción en varias líneas, siendo necesario tener en cuenta lo mencionado sobre particiones correctas e incorrectas (cf. secciones 2.10.1 y 2.10.2).
Cuando se trabaja desde el editor de scripts de RStudio, puede ejecutarse una instrucción, una región del script o todo el script. Al presionar la combinación de teclas Ctrl + Enter o pulsar el botón Run , se ejecuta la instrucción en la que se encuentre ubicado el cursor o alguna región que se hubiera seleccionado si este fuera el caso. Para ejecutar todo el script, aunque podría enviarse la orden de ejecución tras seleccionarlo en su totalidad11, es más expedito ejecutarlo —sin necesidad de haberlo seleccionado previamente— presionando la combinación de teclas Ctrl + Shift + Enter, lo que equivale a presionar el botón Source o escribir el comando:
source("ruta/nombre.del.script", echo = T)
En R existen dos modos de ejecución: modo interactivo, a través de la consola, y modo script, a través del editor de scripts.
El modo interactivo puede agilizar la realización de operaciones únicas y puntuales, que no sea necesario volver a realizar en futuras sesiones de trabajo. Para la otra gran mayoría de casos —y muy particularmente para el análisis de datos— se trabaja en modo script, el cual brinda trazabilidad a los análisis, dejando abierta la posibilidad de su ampliación o modificación.
2.13 Comentarios
Al igual que todos los lenguajes de programación, R admite comentarios, esto es, cadenas de texto que se insertan a manera de guía, para referencia del usuario, sin que tengan ningún efecto en los procesos realizados. Cualquier cadena de texto que inicie con el símbolo numeral (#
) constituye un comentario12. Asimismo, puede usarse el símbolo #
para desactivar temporalmente alguna línea que no se desee ejecutar dentro de un script. Los comentarios pueden ocupar una o más líneas completas, pero también pueden ir al final de una línea que tenga código ejecutable. La inserción de comentarios genera orden y facilita la comprensión los scripts, por lo que se recomienda ampliamente su uso.
Asimismo, cuando se leen scripts desde RStudio, es posible adaptar los comentarios para que sirvan como marcadores de sección, facilitando la navegación a través del script. Cualquier cadena de caracteres que inicie con al menos un símbolo numeral (#
) y que finalice con al menos cuatro símbolos numeral (####
) funcionará como tal. Equivalentemente, podría finalizarse con cuatro o más guiones (----
). Podrá accederse a tales marcadores desde la parte inferior de la ventana del editor de scripts.
# Predicciones ------------------------------------------------
Asimismo, cuando se trabaja en RStudio, puede accederse al panel de marcadores presionando el botón Outline , el cual se ubica en la parte superior derecha del panel del script, o presionando Ctrl + Shift + O.
Para desactivar rápidamente un bloque de instrucciones, de manera que no se ejecute en un script, basta con seleccionarlo y presionar las teclas Ctrl + Shift + C, con lo cual se anteponen marcas (#
) a cada una de las líneas del bloque. La misma combinación de teclas retira las marcas (#
) del bloque seleccionado.