A Programación en R

`R` es un programa chido de estadística. FIN.

Figure A.1: R es un programa chido de estadística. FIN.

Una de las primeras cosas que necesitamos saber es que R (por más que sus más ávidos defensores digan lo contrario) no es para todo. Si tú ya conoces otro lenguaje (sea Stata, Excel, SAS, Python, Matlab, Julia, etc) sabrás utilizar muchas de sus opciones. Estoy seguro que, de conocer uno de estos, te será muchísimo más fácil seguir sacando promedios en tu lenguaje favorito que en R, realizar regresiones lineales es probablemente más sencillo en Stata mientras que las gráficas de barras para mí son más simples en Excel, Python excede en aplicaciones de inteligencia artificial mientras que Matlab es más veloz que R, Julia tiene muchas cosas de ecuaciones diferenciales que nadie más.

Lo que probablemente no sea más sencillo de hacer en otro lenguaje es realizar análisis estadístico, gráficas de todo tipo y modelos de simulación. Para eso, R es, indiscutiblemente, una de las mejores opciones para quienes no conocen de programación8.

Finalmente, uno de los consejos más importantes que te puedo dar es que este curso no te va a servir si no practicas. Igual que como pasa con los idiomas uno no aprende R en una semana sin practicarlo después. Mi sugerencia es que, a la vez que sigues estas notas comiences a trabajar un proyecto tuyo específico junto con el buscador de Internet de tu preferencia a la mano y empieces a usar R en él. Practica9.

A.1 Algunas ventajas de R y cosas no tan padres

A.1.1 Puntos a favor de R

  • Todo el mundo lo usa. Quizá éste es el punto más a favor. Si mucha gente lo conoce y lo utiliza, hay más opciones de ayuda. Los sitios de StackOverflow en inglés y en español son excelentes para pedir apoyo en R; los grupos de usuarios de Google son otra fuente muy buena. Entre más gente usa el programa; es más fácil obtener ayuda porque seguro alguien más tuvo hace ya tiempo el mismo problema que tú.

  • Todas las personas que trabajan en estadística publican sus métodos y su código en R (eso, claro, cuando publican sus métodos). Es raro encontrar un nuevo método estadístico en el mundo y que no se pueda usar, de alguna forma, en R.

  • Dentro de los lenguajes de programación R es de los más sencillos. Quienes lo hicieron realmente se preocuparon por su público (de no especialistas) y en general desarrollan para él.

  • R es gratis. Y en esta época de austeridad, cualquier ahorro es bueno. Que sea gratis no significa que no esté respaldado: existen versiones de R respaldadas por grandes compañías como Microsoft

  • Todo lo que se hace en R es público. R no tiene métodos secretos ni es una caja negra. Todo lo que hace cada una de las funciones de R, cualquiera lo puede revisar, por completo.

  • En R puedes hacer libros o notas ¡como este! donde guardes todo tu trabajo, reportes automatizados e incluso documentos interactivos para facilitar el análisis de datos.

  • R puede hacer gráficas bonitas:

Por supuesto, no todo es miel sobre hojuelas con R. Particularmente, algunos de los problemas con el lenguaje:

La curva de aprendizaje de `R` es más empinada pero después de un rato vale la pena

Figure A.2: La curva de aprendizaje de R es más empinada pero después de un rato vale la pena

  • La curva de aprendizaje es mucho más empinada que para otros programas estadísticos (como Stata, SAS o SPSS) ¡particularmente si es tu primera vez programando!

  • La mayor parte de las personas que trabajan en R no son programadores de verdad. Gran parte del código que te puedes encontrar en el mundo real está escrito con prisa para salir del aprieto sin mucha planeación, con pocos comentarios, falta de control de versiones y pocas herramientas de revisión. ¡Internet está lleno de creaturas espantosas escritas en R!

`R` puede ser muy lento pero eso te da oportunidad de hacer otras cosas ;) .

Figure A.3: R puede ser muy lento pero eso te da oportunidad de hacer otras cosas ;) .

  • R de ninguna manera es veloz por lo que algunos programas (lo veremos en simulación) pueden ser extremada (y dolorosamente) lentos.

A.2 Bienvenidx a R, Camp Pontanezen (sí, así se llama esta versión)

R es un lenguaje de cómputo y un programa estadístico libre, gratuito, de programación funcional (¿qué es eso?), orientado a objetos (what??) que mutó a partir de otros dos lenguajes conocidos como Scheme y S10. El primero de estos fue desarrollado en el MIT por Sussman y Steele mientras que el segundo surgió en los laboratorios Bell11 creado por Becker, Wilks y Chambers. R nació en junio de 1995 a partir del trabajo de Ross Ihaka y Robert Gentleman12.

Desde su creación, la mayor parte del desarrollo de R ha sido trabajo completamente voluntario de la Fundación R, del equipo de R Core y de miles de usuarios que han creado funciones específicas para R conocidas como paquetes (packages). Actualmente el repositorio más importante de R, CRAN, contiene más de 16000 paquetes con distintas funciones para hacer ¡lo que quieras!

Como todo el trabajo en R es voluntario hace falta:

  1. Una homologación en los métodos. Puedes encontrar varias funciones que supuestamente hacen exactamente lo mismo (como es el caso de emojifont, fontemoji y emoGG para graficar usando emojis).

  2. Estandarizar la notación. Algunos paquetes como aquellos del tidyverse (veremos más adeltna) utilizan pipes (%>%); estos sólo funcionan en el tidyverse pero no fuera del mismo.

Sin embargo, también es una gran ventaja que sean los usuarios de R quienes guían su desarrollo. El lenguaje va mutando según peticiones de las personas que lo usan. Si hay algo que te gustaría R tuviera y aún no existe ¡lo puedes proponer!

A.3 Instalando cosas

A.3.1 Instalación de R

Oficialmente, la página de `R` es de las páginas más feas del mundo. ¡No te dejes llevar por las apariencias!

Figure A.4: Oficialmente, la página de R es de las páginas más feas del mundo. ¡No te dejes llevar por las apariencias!

A lo largo de estas notas estaré trabajando con: R version 4.1.0 (2021-05-18) Camp Pontanezen. La más reciente versión de R la puedes encontrar en CRAN. Para ello ve al sitio y selecciona tu plataforma.

Nota usuarios de Mac En algunas Mac, al abir R, aparece el siguiente mensaje de advertencia: During startup - Warning messages: 1: Setting LC_CTYPE failed [...] para solucionarlo ve a Aplicaciones y abre Terminal. Copia y pega en ella el siguiente texto: defaults write org.R-project.R force.LANG en_US.UTF-8 Da enter, cierra la Terminal y reinicia R.

  • En el caso de Windows da clic en Download R for Windows y luego en install R for the first time. Finalmente, ejecuta el instalable que aparece al dar click en Download R 4.1.0 for Windows .

Para este curso pudiera ser que requirieras las herramientas de desarrollador Rtools.

  • En el caso de Mac selecciona Download R for (Mac) OS X y luego elige R-4.1.0.pkg. En Mac puede que necesites instalar adicionalmente XQuartz (según tu versión de Mac). Si tu Mac es una versión suficientemente antigua, sigue las instrucciones específicas de CRAN.

  • En el caso de Linux al elegir Download R for Linux tendrás la opción de buscar tu distribución específica. Al elegirla, aparecerán instrucciones para tu terminal de comandos; síguelas. En el caso de Linux, según los paquetes de R que elijamos instalar en la computadora requerirás instalar paquetería adicional para tu distribución de Linux. R te informará de la paquetería necesaria conforme la requiera.

Si tienes problemas para instalar puedes usar RStudio Cloud.

A.4 Instalación de RStudio

RStudio es una empresa que se dedica a hacer cosas para R.

Figure A.5: RStudio es una empresa que se dedica a hacer cosas para R.

RStudio es una interfaz gráfica (IDE) para R. Puedes pensar a R como el Bloc de Notas y a RStudio como Word. El Bloc tiene todas las capacidades que necesitas para poder escribir; empero, es muchísimo mejor trabajar tus papers en Word. De la misma manera, R tiene todas las capacidades para hacer estadística pero un formato horrible y RStudio se ha convertido en la más popular forma de usar R. Por supuesto que no es la única; algunas alternativas son Atom con ide-r, Eclipse con StatET y RKWard. En general es posible seguir estas notas sin que tengas RStudio pero, si es tu primera vez programando, no lo recomiendo.

Si ya tienes experiencia con lenguajes como Python, Javascript, Java ó alguno de los mil C que existen, no tendrás ningún problema usando el editor de tu preferencia.

Para descargar RStudio ve a su página y da clic en Download RStudio. Baja tu pantalla hasta donde dice Installers for Supported Platforms y elige tu plataforma: Windows, Mac OS X ó tu sabor de Linux preferido. Una vez descargado el archivo, ábrelo y sigue las instrucciones que aparecen en pantalla.

A.5 Primeros pasos en R usando RStudio

Una vez hayas instalado R y RStudio, abre RStudio13. Te enfrentarás a una pantalla similar a esta:

La primera vez que abres RStudio

Figure A.6: La primera vez que abres RStudio

Si tu RStudio tiene sólo 3 páneles, como en mi caso, ve a la esquina superior izquierda (signo de hoja+) y elige un nuevo R Script

Elige hoja+ para crear un nuevo archivo

Figure A.7: Elige hoja+ para crear un nuevo archivo

Tendrás, entonces, 4 páneles como se ve a continuación:

RStudio <3

Figure A.8: RStudio <3

  1. El primer panel (esquina inferior izquierda) es la Consola. Aquí es donde se ejecutan las acciones. Prueba escribir 2 + 3 en él y presiona enter. Aparece el resultado de la suma. Definitivamente, R es la calculadora que más trabajo cuesta instalar.
La consola de `R` es la calculadora más difícil de instalar que existe.

Figure A.9: La consola de R es la calculadora más difícil de instalar que existe.

  1. El segundo panel (esquina superior izquierda) es el panel con el Script. Aquí se escribe el programa pero no se ejecuta. Prueba escribir 10 + 9. ¿Ves que no pasa nada? Lo que acabas de hacer es crear un programa que, cuando se ejecute, hará la suma de 10 + 9. ¡Qué programa más aburrido! Sin embargo, no todo está perdido: presiona CTRL+Enter (Cmd+Enter en Mac) al final de la línea o bien da clic en Run y verás que, en la consola, aparece la instrucción y el resultado de la misma. El Script es una excelente fuente para tener un historial de lo que estás haciendo.
El `Script` sirve para salvar las instrucciones en el orden en que las vas a ejecutar.

Figure A.10: El Script sirve para salvar las instrucciones en el orden en que las vas a ejecutar.

  1. El tercer panel contiene el ambiente. Aquí aparecerán las variables que vayamos creando. Por ahora, para poner un ejemplo, importaremos el archivo Example1.csv (con valores simulados) disponible en Github dando clic en Import Dataset y From Text (base). Selecciona el archivo y elige las opciones en la ventana de previsualización que hagan que se vea bien. Nota que una vez realizada la importación aparece en el panel derecho Example1. Al dar clic podrás ver la base de datos. Las bases de datos y variables que utilices durante tus análisis aparecerán en esa sección.
El `Ambiente` muestra las variables (incluyendo bases de datos) que estás utilizando en este momento. A diferencia de otros programas estadísticos (o sea `Stata`) en `R` es posible tener múltiples bases de datos abiertas a la vez.

Figure A.11: El Ambiente muestra las variables (incluyendo bases de datos) que estás utilizando en este momento. A diferencia de otros programas estadísticos (o sea Stata) en R es posible tener múltiples bases de datos abiertas a la vez.

  1. Para entender mejor lo que ocurre en el último de los páneles, lo mejor es trabajar con nuestra base. Escribe en la consola plot(Example1) . En el cuarto pánel aparecerá una gráfica. El cuarto de los páneles para nosotros tendrá esa utilidad: mostrará las gráficas que hagamos así como la ayuda. Para ver la ayuda para las instrucciones de R puedes escribir ?. Prueba teclear ?plot en la consola. El signo de interrogación es un help() que muestra las instrucciones para usar una función.
La gráfica que aparece de hacer un `plot` de la base de datos de ejemplo.

Figure A.12: La gráfica que aparece de hacer un plot de la base de datos de ejemplo.

El cuarto panel muestra respectivamente las gráficas y la ayuda.

Figure A.13: El cuarto panel muestra respectivamente las gráficas y la ayuda.

Mi sugerencia personal es que escribas todo lo que haces en el Script y que sólo utilices la consola para verificar valores. De esta manera podrás almacenar todas las instrucciones ejecutadas y volver a ellas cuando se requieran. Por último te sugiero utilizar # gatos para comentar tu código. Así, el código anterior lo podrías ver en la consola como:

#Aquí pruebo cómo R hace las sumas
10 + 9

Comenta. Comenta. Comenta, por favor. Tu ser del futuro que regrese a sus archivos de R un mes después de haberlos hecho te lo agradecerá (y tu profe también).

Finalmente y como aclaración para estas notas, el código de R aparece como:

#Esto es código de R
7 - 2

Mientras que los resultados de evaluar en R se ven con #:

## [1] 5

Así, la evaluación con su resultado se ve de la siguiente forma:

#Esto es código de R
7 - 2
## [1] 5

A.6 Cálculos numéricos

R sirve como calculadora para las operaciones usuales. En él puedes hacer sumas,

#Esto es una suma en R
12 + 31
## [1] 43
Ada Lovelace (1815-1852), la primera en diseñar un algoritmo computacional ¡y sin tener computadoras!

Figure A.14: Ada Lovelace (1815-1852), la primera en diseñar un algoritmo computacional ¡y sin tener computadoras!

restas,

#Esto es una resta en R
3 - 4
## [1] -1

multiplicaciones,

#Esto es una multiplicación en R
7*8
## [1] 56

divisiones,

#Esto es una división en R
4/2
## [1] 2

sacar logaritmos naturales \(\ln\),

#Para sacar logaritmo usas el comando log
log(100)
## [1] 4.60517

o bien logaritmos en cualquier base,14

#Puedes especificar la base del logaritmo con base 
log(100, base = 10)
## [1] 2

también puedes elevar a una potencia (por ejemplo hacer \(6^3\)),

#Así se calculan potencias
6^3
## [1] 216

calcular la exponencial \(e\),

#Para exponenciales puedes usar exp
exp(1)
## [1] 2.718282

o bien exponenciar cualquier variable \(e^{-3}\),

#O bien exponenciales específicas, e^-3
exp(-3)
## [1] 0.04978707

también puedes usar el número \(\pi\).

#Cálculo de pi
pi
## [1] 3.141593

No olvides que R usa el orden de las operaciones de matemáticas. Siempre es de izquierda a derecha con las siguientes excepciones:

  1. Primero se evalúa lo que está entre paréntesis.

  2. En segundo lugar se calculan potencias.

  3. Lo tercero en evaluarse son multiplicaciones y divisiones.

  4. Finalmente, se realizan sumas y restas.

Por ejemplo, en la siguiente ecuación \[ 2 - 2 \cdot \frac{(3^4 - 9)}{(5 + 4)} \] se resuelven primero los paréntesis \((3^4 - 9) = 81 - 9 = 72\) y \((5 + 4) = 9\); luego se resuelve la división: \(\frac{72}{9}=8\), se multiplica por el \(2\): \(2 \cdot 8 = 16\) y finalmente se hace la resta: \(2-16 = -14\).

A.6.1 Ejercicio

Determina, sin evaluar, los resultados de los siguientes segmentos de código:

#Primer ejercicio 
(9 - 3)^2 * (2 - 1) - 6
#Segundo ejercicio 
6 * 2 / (7 - 3) * 5
#Tercer ejercicio 
2 * 3 ^ 2 * 2 / (5 - 4) * 1 / 10 

Evalúa para comprobar tu respuesta.

A.6.2 Ejercicio

Calcula el área y el perímetro de un círculo de radio 5. Recuerda que la fórmula del área es \(\pi \cdot r^2\) donde \(r\) es el radio; mientras que la del perímetro es: \(\pi \cdot d\) donde \(d\) es el díametro (= dos veces el radio).

A.6.3 Respuestas

## Área = 78.5398163397448
## Perímetro = 31.4159265358979

A.7 Variables

R es un programa orientado a objetos; esto quiere decir que R almacena la información en un conjunto de variables que pueden tener diferentes clases y opera con ellos según su clase. Por ejemplo, un conjunto de caracteres, entre comillas, es un Character (R lo piensa como texto)

#Un conjunto de caracteres es un char
"Hola"
## [1] "Hola"

Un número (por ejemplo 2 tiene clase numeric)15. Hay que tener mucho cuidado con combinar floats con Strings:

#Código que sí funciona porque ambos son números
2 + 4 
## [1] 6
El algoritmo diseñado por Ada Lovelace.

Figure A.15: El algoritmo diseñado por Ada Lovelace.

#Código que no funciona porque uno es caracter
2 + "4" 
## Error in 2 + "4": non-numeric argument to binary operator

Si lo piensas, este último error ¡tiene todo el sentido! no puedes sumar un número a un texto. ¿O qué significaría 'Felices' * 4 ?

La magia de R comienza con que puedes almacenar valores en variables. Por ejemplo, podemos asignar un valor a una variable:

#Asignamos x = 10
x <- 10

La flecha de asignación funciona para ambos lados pero no se recomienda usarla al revés:

#Asignamos x = 10
10 -> x

Hay dos formas de asignar valores, una es con la flecha de asignación \(\leftarrow\) (o \(\rightarrow\) si quieres ver el mundo arder) y otra con el signo de igual:

#Podemos asignar valores con el signo de =
y = 6

Nota que, cuando realizamos operaciones, la asignación es la última que se realiza:

#Aquí z = 106
z <- y + x^2

Los valores que fueron asignados en las variables, R los recuerda y es posible calcular con ellos:

#Podemos realizar una suma
x + y
## [1] 16
#O bien podemos realizar una multiplicación
3*y - x
## [1] 8

Podemos preguntarnos por el valor de las variables numéricas mediante los operadores == (sí, son dos iguales), != (que es un \(\neq\)) >, >=, <= y <:

#Podemos preguntarnos si x vale 4
x == 4
## [1] FALSE

El operador de asignación también se puede utilizar al revés \(2 \rightarrow x\) pero no lo hagas, por favor.

Nota que no estamos asignando el valor de x:

x
## [1] 10

Podemos preguntarnos por diferencia:

x != 4 
## [1] TRUE

Así como por mayores, menores incluyendo posibles igualdades (i.e. los casos \(\geq\) y \(\leq\))

#Nos preguntamos si x > y
x > y
## [1] TRUE
#Nos preguntamos si x >= 10
x >= 10
## [1] TRUE
#Nos preguntamos si y < 6
y < 6
## [1] FALSE
#O bien si y <= 6
y <= 6
## [1] TRUE

En todos los casos los resultados han sido TRUE ó FALSE. La clase de variables que toma valores TRUE ó FALSE se conoce como booleana. Hay que tener mucho cuidado con ellas porque, puedes acabar con resultados muy extraños:

#MALAS PRÁCTICAS, NO HAGAS ESTO
#Cuando lo usas como número TRUE vale 1
100 + TRUE
## [1] 101
#MALAS PRÁCTICAS, NO HAGAS ESTO
#Cuando lo usas como número FALSE vale 0
6*FALSE
## [1] 0

Aquí puedes encontrar una lista de malas prácticas en computación a evitar.

Finalmente, nota que es posible reescribir una variable y cambiar su valor:

#Aquí x vale 10, como antes
x
## [1] 10
#Aquí cambianos el valor de x y valdrá 0.5
x <- 0.5
x
## [1] 0.5

A.7.1 Ejercicios

Determina el valor que imprime R en cada caso, sin que corras los siguientes pedazos de código. Después, verifica tu respuesta con R:

#Primer ejercicio
x <- 100
y <- 3
x > y
#Segundo ejercicio
z <- (4 - 2)^3
z <- z + z + z
z
#Tercer ejercicio
x <- 3
y <- 2
z <- x * y
x <- 5
y <- 10
z
#Cuarto ejercicio
variable1 <- 1000
variable2 <- 100
variable3 <- variable1/variable2 <= 10
variable3
#Quinto ejercicio
"2" - 2
#Sexto ejercicio
(0.1 + 0.1 + 0.1) == 0.3

A.7.2 NIVEL 3

Determina, sin correr el programa, qué regresa la consola en este caso

x <- 2 
x <- 5 + x -> y -> x
x <- x^2
x

Comprueba con la consola tus resultados; puede que encuentres respuestas poco intuitivas.

A.8 Observaciones sobre la aritmética de punto flotante

Si hiciste el penúltimo ejercicio (el cual, obviamente hiciste y comprobaste con la consola) podrás haber notado una trampa. Analicemos qué ocurre; quizá hicimos mal la suma

#Veamos si este lado está mal
(0.1 + 0.1 + 0.1)
## [1] 0.3
#O si éste es el que tiene la trampa
0.3
## [1] 0.3

Aparentemente no hay nada malo ¿qué rayos le pasa a R? La respuesta está en la aritmética de punto flotante. Podemos pedirle a R que nos muestre los primeros 100 dígitos de la suma 0.1 + 0.1 + 0.1:

Réplica de la Z3, la primer computadora con punto flotante (1941).

Figure A.16: Réplica de la Z3, la primer computadora con punto flotante (1941).

#Veamos qué pasa con la suma
options(digits = 22) #Cambiamos dígitos
(0.1 + 0.1 + 0.1)    #Sumamos
## [1] 0.3000000000000000444089

El comando options(digits = 22) especifica que R debe imprimir en la consola 22 dígitos. No más.

¡Ahí está el detalle! R no sabe sumar. En general, ningún programa de computadora sabe hacerlo. Veamos otros ejemplos:

4.1 - 0.1 #Debería dar 4
## [1] 3.999999999999999555911
3/10      #Debería ser 0.3
## [1] 0.2999999999999999888978
log(10^(12345), base = 10) #Debería dar 12345
## [1] Inf

El problema está en cómo las computadoras representan los números. Ellas escriben los números en binario. Por ejemplo, 230 lo representan como 11100110 mientras que el 7 es: 111. El problema de las computadoras radica en que éstas tienen una memoria finita por lo que números muy grandes como: \(124765731467098372654176\) la computadora hace lo mejor por representarlos eligiendo el más cercano:

#Nota la diferencia entre lo que le decimos a R
#y lo que resulta
x <- 124765731467098372654176
x
## [1] 124765731467098377420800

Un error de punto flotante en la vida real ocasionó en los años noventa, la explosión del cohete Ariane 5. Moraleja: hay que tener cuidado y respeto al punto flotante.

No olvides cambiar la cantidad de dígitos que deseas que imprima R en su consola de vuelta:

options(digits = 6) #Cambiamos dígitos

El mismo problema ocurre con números decimales cuya representación binaria es periódica; por ejemplo el \(\frac{1}{10}\) en binario se representa como \(0.0001100110011\overline{0011}\dots\). Como es el cuento de nunca acabar con dicho número, R lo trunca y almacena sólo los primeros dígitos de ahí que, cada vez que escribes 0.1, R en realidad almacene el 0.1000000000000000055511 que es casi lo mismo pero no es estrictamente igual. Hay que tener mucho cuidado con esta inexactitud de las computadoras (inexactitud estudiada por la rama de Análisis Numérico) pues puede generar varios resultados imprevistos.

A.8.1 ¿Cómo checar un if?

En general lo que hacen las computadoras para comparar valores es que verifican que, en valor absoluto, el error sea pequeño. Recuerda que el valor absoluto de \(x\), \(|x|\), regresa siempre el positivo: \[ |4| = 4 \qquad \textrm{y} \qquad |-8| = 8 \]

Para verificar que algo es más o menos \(0.3\) suele usarse el valor absoluto16 de la siguiente manera:

abs( (0.1 + 0.1 + 0.1) - 0.3 ) < 1.e-6
## [1] TRUE

donde 1.e-6 es notación corta para 0.000001 (también escrito como \(1\times 10^{-6}\)). La pregunta que nos estamos haciendo es que si el error entre sumar \(0.1+0.1+0.1\) y \(0.3\) es muy pequeño \(< 0.000001\): \[ | (0.1 + 0.1 + 0.1) - 0.3 | < 0.000001 \]

A.9 Leer y almacenar variables en R

Para terminar esta sección, aprenderemos cómo guardar variables en R. Para eso, el concepto de directorio es uno de los más relevantes. En general, en computación, el directorio se refiere a la dirección en tu computadora donde estás trabajando. Por ejemplo, si estás en una carpeta en tu escritorio de nombre “Ejercicios_R” probablemente tu directorio sea ‘~/Desktop/Ejercicios_R/’ (en Mac) o bien ‘~\Desktop\Ejercicios_R\’ en Windows17. La forma de saber tu directorio (en general) es ir a la carpeta que te interesa y con clic derecho ver propiedades (o escribir ls en la terminal Unix).

R tiene un directorio default que quién sabe dónde está (depende de tu instalación, generalmente está donde tu Usuario). Usualmente lo mejor es elegir un directorio para cada uno de los proyectos que hagas. Para ello si estás en RStudio puedes utilizar Shift+Ctrl+H (Shift+Cmd+H en Mac) o bien ir a Session > Set Working Directory > Choose Directory y elegir el directorio donde deseas trabajar tu proyecto. Pensando que elegiste el escritorio (Desktop en mi computadora) notarás que en la consola aparece el comando setwd("~/Desktop") (o bien con ‘\’ si eres Windows). Mi sugerencia es que copies ese comando en tu Script para que, la próxima vez que lo corras ya tengas preestablecido el directorio.

#Si eres Mac/Linux
setwd("~/Desktop") 

#Si eres Windows
setwd("C:\Users\Rodrigo\Desktop") #Rodrigo = Mi usuario

Podemos verificar el directorio elegido con getwd():

getwd()

En general es buena práctica en R establecer, hasta arriba del Script, el comando de directorio. Esto con el propósito de que, cuando compartas un archivo, la persona a quien le fue compartido el archivo pueda rápidamente elegir su propio directorio en su computadora.

Probemos guardar unas variables en un archivo dentro de nuestro directorio. Para ello utilizaremos el comando save.

#Crear las variables
x <- 200
y <- 100

#Los archivos de variables de R son rda
save(x,y, file = "MisVariables.rda")

Si vas a tu directorio, notarás que el archivo MisVariables.rda acaba de ser creado. De esta forma R puede almacenar objetos creados en R que sólo R puede leer (más adelante veremos cómo exportar bases de datos y gráficas). Observa que en tu ambiente (si estás en RStudio puedes verlas en el panel 3) deben aparecer las variables que hemos usado hasta ahora:

##   [1] "vr.name"                "p.val"                  "sub10"                 
##   [4] "ybarra"                 "sub11"                  "sub12"                 
##   [7] "costo"                  "sub13"                  "sub14"                 
##  [10] "sub15"                  "sub16"                  "sub17"                 
##  [13] "sub18"                  "confianza.bajo"         "sub19"                 
##  [16] "bw"                     "eps.error"              "ci"                    
##  [19] "sub20"                  "sub21"                  "sub22"                 
##  [22] "sub23"                  "varianza.est"           "var.total"             
##  [25] "sub24"                  "Uc"                     "sub25"                 
##  [28] "mediana.real"           "sub26"                  "intervalos.simulados"  
##  [31] "sub27"                  "Uf"                     "sub28"                 
##  [34] "sub29"                  "sub30"                  "sub31"                 
##  [37] "sub32"                  "sub33"                  "sumaAh"                
##  [40] "sub34"                  "sub35"                  "sub36"                 
##  [43] "func.opt.1"             "sub37"                  "func.opt.2"            
##  [46] "sub38"                  "sub39"                  "k.val"                 
##  [49] "datos"                  "var.x"                  "sub40"                 
##  [52] "promedios.muestra"      "sub41"                  "sub42"                 
##  [55] "sub43"                  "base.costos"            "sub44"                 
##  [58] "xbarra"                 "sub45"                  "sub46"                 
##  [61] "sub47"                  "B"                      "sub48"                 
##  [64] "sub49"                  "y.val"                  "sub50"                 
##  [67] "sub51"                  "sub52"                  "sub53"                 
##  [70] "nsim"                   "N"                      "sub54"                 
##  [73] "sub55"                  "sub56"                  "sub57"                 
##  [76] "sub58"                  "sub59"                  "ci_up"                 
##  [79] "Z"                      "sub60"                  "sub61"                 
##  [82] "sub62"                  "sub63"                  "sub64"                 
##  [85] "ci_low"                 "sub65"                  "pop"                   
##  [88] "sub66"                  "sub67"                  "sub68"                 
##  [91] "sub69"                  "escuelas.seleccionadas" "varianza"              
##  [94] "f"                      "escuelas"               "i"                     
##  [97] "j"                      "sub70"                  "k"                     
## [100] "sub71"                  "sub72"                  "m"                     
## [103] "sub73"                  "n"                      "sub74"                 
## [106] "sub75"                  "sub76"                  "sub77"                 
## [109] "sub78"                  "sub79"                  "imagenes.muestreadas"  
## [112] "x"                      "y"                      "z"                     
## [115] "sub80"                  "sub81"                  "sub82"                 
## [118] "sub83"                  "sub84"                  "sub85"                 
## [121] "sub86"                  "Loblolly"               "nombres"               
## [124] "sub87"                  "mediana.muestral"       "sub88"                 
## [127] "sub89"                  "sub90"                  "sub91"                 
## [130] "media.completa"         "sub92"                  "sub93"                 
## [133] "sub94"                  "sub95"                  "sub96"                 
## [136] "sub97"                  "alpha"                  "sub98"                 
## [139] "sub99"                  "epsilon"                "dats"                  
## [142] "remuestreo"             "arboles"                "media"                 
## [145] "Uboot"                  "alpha.val"              "base.completa"         
## [148] "mediana"                "img"                    "pop.total"             
## [151] "edad"                   "total.muestra"          "base.datos"            
## [154] "base.nh"                "confianza.alto"         "lado.inf"              
## [157] "sub1"                   "sub2"                   "sub3"                  
## [160] "proba"                  "sub4"                   "sub5"                  
## [163] "sub6"                   "lado.sup"               "sub7"                  
## [166] "sub8"                   "sub9"                   "raiz"                  
## [169] "make.vr"                "imagen"                 "r1"                    
## [172] "sub100"                 "r2"                     "Bi"                    
## [175] "r3"                     "datos.escuelas"         "lambda"                
## [178] "muestra"                "g.fun"                  "Ntotal"                
## [181] "s2"                     "m.val"                  "Example1"              
## [184] "lambda.1"               "zalpha"                 "lambda.2"              
## [187] "ensanut"                "total"                  "diseño"

Podemos probar sumar nuestras variables y todo funciona súper:

x + y #Funciona magníficamente
## [1] 300

Limpiemos el ambiente. El comando equivalente al clear all en R es un poco más complicado de memorizar:

#EL clear all de R
rm(list = ls())

Ahora, si vuelves a ver el ambiente, éste estará vacío: ¡hemos limpiado el historial! Nota que si intentamos operar con las variables, R ya no las recuerda:

x + y #Error
## Error in eval(expr, envir, enclos): object 'x' not found

Así como hay que lavarse las manos antes de comer, es buen hábito limpiar todas las variables del ambiente de R antes de usarlo.

Podemos leer la base de datos usando load:

#Leemos las variables
load("MisVariables.rda")

#Una vez leídas podemos empezar a jugar con ellas
x + y #Ya funciona
## [1] 300

Por último, es necesario resaltar la importancia del directorio. Para ello crea una nueva carpeta en tu escritorio de nombre Mi_curso_de_R. Mueve el archivo "MisVariables.rda" dentro de la carpeta. Borra todo e intenta leer de nuevo el archivo:

#Borramos todo
rm(list = ls())

#Intentamos leer el archivo de nuevo
load("MisVariables.rda")
## Warning in readChar(con, 5L, useBytes = TRUE): cannot open compressed file
## 'MisVariables.rda', probable reason 'No such file or directory'
## Error in readChar(con, 5L, useBytes = TRUE): cannot open the connection

Este error es porque R sigue pensando que nuestro directorio es el escritorio y está buscando el archivo ahí sin hallarlo. Para encontrarlo hay que cambiar el directorio a través de RStudio (ya sea Ctrl+Shift+H o Session >Set Working Directory > Choose Directory) o bien a través de comandos en R:

#Si eres Mac/Linux
setwd("~/Desktop/Mi_curso_de_R") 

#Si eres Windows
setwd("C:\Users\Rodrigo\Desktop\Mi_curso_de_R") #Rodrigo = Mi usuario
#Aquí sí se puede leer
load("MisVariables.rda")

A.9.1 Ejercicio

Responde a las siguientes preguntas:

  1. ¿Qué es el directorio y por qué es necesario establecerlo?

  2. Si R me da el error 'No such file or directory' ¿qué hice mal?

  3. En RStudio, ¿qué hace Session > Restart R? ¿cuál es la diferencia con rm(list = ls())?

  4. ¿Qué hace el comando cat("\014")? (Ojo puede que no haga nada). Si funciona, ¿cuál es la diferencia con rm(list = ls()) y con Restart R?

A.10 Instalación de paquetes

Un paquete de R es un conjunto de funciones adicionales elaboradas por los usuarios, las cuales permiten hacer cosas adicionales en R. Para instalarlos requieres de una conexión a Internet (o bien puedes instalarlos a partir de un archivo, por ejemplo, mediante una USB). El comando de instalación es install.packages seguido del nombre del paquete. Por ejemplo (y por ocio) descarguemos el paquete beepr para hacer reproducir sonidos en la computadora18. Para ello:

install.packages("beepr")
[...]
* DONE (beepr)

The downloaded source packages are in
    ‘/algun/lugar/downloaded_packages’

Esto significa que el paquete ha sido instalado. Nos interesa usar la función beep que emite un sonido (??beep para ver la ayuda). Si la llamamos así tal cual, nos da error:

beep(3)

R es incapaz de hallar la función porque aún no le hemos dicho dónde se encuentra. Para ello podemos llamar al paquete mediante la función library y decirle a R que incluya las funciones que se encuentran dentro de beepr:

library(beepr)
beep(3) #Esto produce un sonido

El comando library le dice a R ¡hey, voy a usar unas funciones que creó alguien más y que están dentro del paquete beepr! De esta manera, al correr beep(3), R ya sabe dónde hallar la función y por eso no arroja error.

A.10.1 Ejercicios

NIVEL 1

  1. Instala los paquetes tidyverse en R.
  2. De tidyverse haz lo necesario para que el siguiente bloque de código te arroje una gráfica:
#Aquí tienes que hacer algo
#
# RELLENA AQUÍ
#

#Esto genera un histograma
set.seed(1364752)
mis.datos <- data.frame(x = rnorm(1000))
ggplot(mis.datos, aes(x = x)) + 
  geom_histogram(bins = 50, fill = "deepskyblue3") +
  ggtitle("Histograma generado por el código")

NIVEL 3

  1. Instala el paquete devtools (para hacerlo probablemente necesites instalar más cosas en tu computadora; averigua cuáles)
  2. Usa devtools para instalar el paquete emoGG desde Github.
  3. Verifica que tu instalación fue correcta haciendo la siguiente gráfica:
library(emoGG)
ggplot(mtcars, aes(wt, mpg))+ geom_emoji(emoji="1f697")

A.11 Comentarios adicionales sobre el formato

Así como en el español existen reglas de gramática para ponernos todos de acuerdo y entendernos entre todos, en R también existen sugerencias a seguir para escribir tu código. Las sugerencias que aquí aparecen fueron adaptadas de las que utiliza el equipo de Google.

  1. No escribas líneas de más de 80 caracteres (si se salió de tu pantalla, mejor continúa en el siguiente renglón).

  2. Coloca espacios entre operadores +,*,/,-,<-,=, <, <=, >, >=, == y usa paréntesis para agrupar:

#Esto no se ve muy bien
abs(3*5/(4-9)^2-60/100-888+0.1*8888-4/10*2) < 1.e-6

#Los espacios permiten distinguir el orden de las operaciones
abs( (3 * 5) / (4 - 9)^2 - 60 / 100 - 888 
      + (0.1 * 8888) - (4 / 10) * 2 ) < 1.e-6
  1. Intenta alinear la asignación de variables para legibilidad:
#Esto no tanto
altura <- 1.80
peso <- 80
edad <- 32

#Esto se ve bien
altura <- 1.80
peso   <- 80
edad   <- 32
  1. Utiliza nombres que evoquen la variable que representas
#Cuando regreses a esto no sabrás ni qué
x <- 10
y <- 2
z <- 3.14
W <- z * x^y #¿Qué calculé?

#Es mejor especificar la variable
radio        <- 10
potencia     <- 2
pi_aprox     <- 3.14
area_circulo <- pi_aprox * radio^potencia
  1. No utilices un nombre demasiado similar para cosas diferentes.
#Aquí, seguro eventualmente te vas a equivocar
altura <- 10   #Altura del edificio
Altura <- 1.8  #Mi altura
ALTURA <- 2000 #La altitud de la CDMX

#Siempre elegir nombres claros, aunque largos
altura.edificio <- 10   #Altura del edificio
altura.Rodrigo  <- 1.8  #Mi altura
altura.CDMX     <- 2000 #La altitud de la CDMX
  1. Comenta:
#¿Qué hace esto?
x <- 168
x <- x/100
y <- 71.2
print(y/x^2) 
  
#Es mejor así
altura <- 168        #en centímetros
altura <- altura/100 #en metros
peso   <- 71.2       #peso en kg
print(peso/altura^2) #índice masa corporal
Trad: Un periodista se acerca a un programador a preguntarle ¿qué hace que un código sea malo? -Sin comentarios.

Figure A.17: Trad: Un periodista se acerca a un programador a preguntarle ¿qué hace que un código sea malo? -Sin comentarios.

  1. Siempre pon las llamadas a los paquetes y el directorio al inicio de tu archivo para que otro usuario sepa qué necesita.

Código limpio y legible:

#Asumiendo aquí inicia el archivo:
setwd("Mi directorio")

#Llamamos la librería
library(beepr)
library(tidyverse)

#Analizamos una base de datos de R
data(iris) #Base de datos de flores

#Agrupamos la base por especie
iris.agrupada <- group_by(iris, Species)

#Obtenemos la media por longitud de sépalo
iris.media    <- summarise(iris.agrupada, SL.mean = mean(Sepal.Length))

#Avisa que ya terminó
beep(5)

es siempre preferible a código escrito con prisas :

Yo, leyendo mi código no comentado y con mala edición 6 meses después de haberlo hecho.

Figure A.18: Yo, leyendo mi código no comentado y con mala edición 6 meses después de haberlo hecho.

data(iris);setwd("Mi directorio")
library(tidyverse);x<-group_by(iris,Species  )
#Aquí hacemos esto
iris.means=summarise( x,SL.mean=mean(Sepal.Length));library(beepr);beep(5)#FIN

Siempre escribe tu código pensando que alguien más (y ese alguien más puedes ser tú) va a leerlo. ¡No olvides comentar!


  1. Modelos de simulación más avanzados suelen hacerse en C, C++ o Fortran por su velocidad; empero, es necesario conocer más de programación.↩︎

  2. La práctica hace al maestro↩︎

  3. De ahí que se llame R porque la R es una mejor letra que la S (todos lo sabemos) -Atte. Rodrigo, el autor de este documento.↩︎

  4. Mejor conocidos ahora como AT&T, la compañía celular que nunca tiene señal.↩︎

  5. Sus nombres empiezan con la letra R ¿coincidencia?↩︎

  6. Si decidiste no instalar RStudio salta al final de esta sección.↩︎

  7. Recuerda que un logaritmo base \(a\) te dice a qué potencia \(b\) tuve que elevar \(a\) para llegar a \(b\). Por ejemplo \(\log_{10}(100) = 2\) te dice que para llegar al \(100\) tuviste que hacer \(10^2\).↩︎

  8. Puede ser float, int, double pero no nos preocuparemos por eso.↩︎

  9. En R el comando abs toma el valor absoluto.↩︎

  10. Windows usa backslash. Y hay toda una historia detrás de ello↩︎

  11. En los siguientes capítulos descargaremos paquetes más interesantes; pero no desprecies la utilidad de beepr yo lo he usado en múltiples ocasiones para que la computadora me avise que ya terminó de correr un código.↩︎