class: center, middle, inverse, title-slide # Modificando los archivos de inicio de R ### Joselyn Chávez
11 de agosto de 2021 --- class: middle, center ## Este material posee una licencia tipo Creative Commons Attribution-ShareAlike 4.0 International License. ## Para conocer más sobre esta licencia, visite http://creativecommons.org/licenses/by-sa/4.0/ --- class: middle, center ## Material disponible en: ### https://comunidadbioinfo.github.io/cdsb2021_workflows ## Basado en el RStudioConf2020 workshop <br> What They Forgot, disponible en: ### https://rstd.io/wtf-2020-rsc --- # ¿Qué son los archivos de inicio? <div class="figure" style="text-align: center"> <img src="data:image/png;base64,#img/startflow.png" alt="R Startup flowchart de Thomas Lin Pedersen" width="65%" /> <p class="caption">R Startup flowchart de Thomas Lin Pedersen</p> </div> ??? R ofrece una gran diversidad de opciones para personalizar el espacio de trabajo, sin embargo, esta flexibilidad conlleva un alto grado de complejidad. --- # ¿Qué son los archivos de inicio? Al iniciar R, una serie de procesos complejos se ejecutan tras bambalinas. En general, podemos concentrarnos en dos archivos: - El archivo **.Renviron** contiene las variables del ambiente de trabajo que deberán ser establecidas al iniciar cada sesión. - El archivo **.Rprofile** contiene código de R que será ejecutado al iniciar cada sesión. Estos archivos forman parte de una gran familia de archivos de personalización conocidos como *dotfiles* o archivos ocultos. Puedes encontrar más información sobre los archivos de punto en https://dotfiles.github.io/ ??? Este tipo de archivos suelen contener las instrucciones necesarias para dirigir el comportamiento de diversos programas, en particular aquellos que suelen ejecutarse desde un ambiente de linea de comandos. Muchas personas suelen conservar este tipo de archivos dentro de sus repositorios, por ejemplo en GitHub. Consultar los archivos ocultos de otros desarrolladores puede ser una referencia o fuente de inspiración para conocer todo lo que es posible hacer con estos archivos. Una forma rápida para encontrar este tipo de archivos dentro de los repositorios de GitHub es usando la herramienta de búsqueda y escribir .Rprofile. --- # Consideraciones con los *dotfiles* .pull-left[<br><br> - Deben terminar con una linea en blanco. - Puedes marcar esta opción en la configuración de RStudio. ] .pull-right[ <img src="data:image/png;base64,#img/newline.png" width="100%" style="display: block; margin: auto;" /> ] --- class: chapter-slide # Modificando el archivo .Renviron --- # Modificando el archivo .Renviron El archivo .Renviron es útil para configurar cómo se comporta el ambiente de R. Para ver todas las variables de tu .Renviron ejecuta este comando: ```r Sys.getenv() ``` Cada vez que hagas un cambio en el archivo .Renviron debes: - **Guardar el archivo** - **Reiniciar la sesión de RStudio** - Session > Restart R - shift + command + F10 o shift + ctrl + F10. Estas variables **no** son código de R. ??? Estas variables usan un formato similar a los usados en la linea de comandos de shell. --- ## Modificando el historial de la sesión - Dale un vistazo a la ventana History en tu sesión de RStudio, ¿Cuántos comandos ves?. - Veamos la variable R_HISTSIZE (tamaño máximo de tu historial actual). - Ahora abre el archivo .Renviron: ```r usethis::edit_r_environ() ``` - Escribe 'R_HISTSIZE=3' dentro del archivo .Renviron. - Guarda los cambios y reinicia la sesión de RStudio. - Comienza a escribir algunos comandos sencillos en la consola y observa cuántos comandos se muestran en la ventana History. .center[¿Notas la diferencia?] --- ## Modificando el comportamiento de las funciones Podemos modificar qué tan estricta es la evaluación de condicionales. ```r x <- c(5,-2) evaluacion <- function(x) { if (x > 0) { print("Este número es positivo") } else { print("Este número es negativo") } } evaluacion(x) ``` ``` ## Warning in if (x > 0) {: the condition has length > 1 and only the first element ## will be used ``` ``` ## [1] "Este número es positivo" ``` --- class: chapter-slide # Es tu turno! Realiza la Actividad 1<br>5 min --- ## Generando un .Renviron por proyecto .pull-left[ <br> - El inicio de la sesión consiste de varios niveles de revisión. - Cuando trabajamos en una organización puede sernos útil conocer el proceso de inicio. - Del nivel más general (todos los usuarios) hasta el más particular (un sólo usuario o un proyecto en específico) ] .pull-right[ <img src="data:image/png;base64,#img/users.png" width="100%" style="display: block; margin: auto;" /> ] ??? Este proceso ocurre muy rápido y la mayoría de los usuarios no necesita revisarlo a profundidad, pero cuando trabajamos en una organización puede sernos útil conocer que el proceso de inicio va del nivel más general (todos los usuarios) hasta el más particular (un sólo usuario o un proyecto en específico) --- ## Generando un .Renviron por proyecto <br> Podemos generar configuraciones específicas para un proyecto de RStudio. - usethis::edit_r_environ() abre el .Renviron de tu usuario. - usethis::edit_r_environ("project") abre el .Renviron de tu proyecto actual. Vamos a generar un .Renviron para un proyecto: - Limpia las configuraciones de tu archivo .Renviron. - Crea un nuevo proyecto. - Observa la lista de archivos dentro de tu proyecto. - Ejecuta el comando usethis::edit_r_environ("project"). ??? Hasta el momento, las modificaciones al .Renviron las hemos realizado en nuestro usuario general o *home* de nuestra instalación, pero también podemos generar configuraciones específicas para un proyecto de RStudio. --- class: chapter-slide # Es tu turno! Realiza la Actividad 2<br>10 min --- ## Guardando tokens para la conexión con APIs También podemos almacenar las llaves de autenticación para conectar con aplicaciones como GitHub. - En el GitHub de la CDSB existe un paquete llamado 'saludo' (repositorio privado). - Normalmente, podrías instalar un paquete desde GitHub usando el comando: ```r remotes::install_github("comunidadbioinfo/saludo") ``` - Intenta ejecutar este comando, ¿Qué ocurre? ??? En .Renviron también podemos almacenar información sensible, por ejemplo, las llaves de autenticación para conectar con aplicaciones como GitHub. Esto es particularmente útil para la instalación de paqueterías desde el código fuente que veremos más adelante con detalle. Intenta ejecutar este comando, seguramente obtendrás un mensaje que dirá que este repositorio no existe, ¿Por qué pasa esto? Esto se debe a que tu ambiente de R no está conectado con tu usuario de GitHub, debemos indicarle nuestras credenciales usando un Token de autenticación. --- ## Guardando tokens para la conexión con APIs .pull-left[ - Vamos a tu usuario de GitHub. - Entra en Settings > Developer settings > Personal access tokens. - Da clic en Generate new token. - En las opciones 'Select scopes' selecciona 'repo' y 'write:packages'. - Da clic en 'Generate token' y copia el token a tu portapapeles. - Ahora abre tu archivo .Renviron y escribe GITHUB_PAT=TuToken. - Guarda los cambios y reinicia la sesión. - Vuelve a probar la instalación del paquete. ] .pull-right[<br><br> <img src="data:image/png;base64,#img/scopes.png" width="100%" style="display: block; margin: auto;" /> ] --- ## Guardando tokens para la conexión con APIs ** Cuidado con esta información!** Si colocas información sensible dentro del archivo .Renviron y estás trabajando con un repositorio de GitHub, entonces no querrás dejar expuesto este archivo al público. Alternativas: - Agregar este archivo en el archivo **.gitignore**. - Utilizar el paquete **credentials**, por ejemplo: credentials::set_github_pat(). --- class: chapter-slide # Modificando el archivo .Rprofile --- # Modificando el archivo .Rprofile Contiene código de R que será ejecutado cada vez que se inicia una sesión de R. Se ejecuta después de leer las configuraciones de .Renviron pero antes de que podamos escribir código. Se encuentra normalmente en nuestro directorio raíz o *home* (~/.Rprofile), pero puedes configurar su ubicación con R_PROFILE_USER en el archivo .Renviron. La forma más sencilla de abrir nuestro archivo .Rprofile es ejecutando el siguiente comando: ```r usethis::edit_r_profile() ``` --- # Modificando el archivo .Rprofile Algunas configuraciones que se hacen usualmente dentro del .RProfile son: - Establecer la ventana de descarga de CRAN. - Escribir un mensaje de bienvenida a la sesión. - Personalizar el prompt de R. - Establecer algunas configuraciones estéticas como el ancho de la pantalla o la forma en que se despliegan las variables numéricas. - Cargar paquetes que se usan con mucha frecuencia (de manera MUY cautelosa). - Generar sobrenombres o abreviaturas a funciones que usamos frecuentemente. Para ver todas las opciones disponibles a modficar y sus valores actuales usa el comando ```r options() ``` --- ## Modificando la estética de la consola <br><br> Habrás notado que el prompt de la consola es un símbolo ">" . Si por alguna razón esta apariencia no es de tu agrado, puedes modificarla usando: ```r options(prompt = ">>>") ``` Si ejecutas esta función directamente en tu consola en lugar de escribirlo en .Rprofile también verás el efecto, pero solamente se mantendrá mientras estés en la sesión actual. --- ## Modificando el número de dígitos <br> Ejecuta el comando options() y busca la variable 'digits', vamos a modificarlo. - En la consola realiza la operación 1/3. - Abre tu archivo .Rprofile usando usethis::edit_r_profile(). - Agrega el siguiente código: ```r options(digits=3) ``` - Guarda los cambios y reinicia la sesión. - Vuelve a realizar la operación 1/3 y observa la diferencia. ??? Ejecuta el comando options() y busca la variable 'digits', verás que por defecto es igual a 7. Esto significa que al realizar una operación matemática obtendremos máximo 7 dígitos en la consola. Probablemente sea más cómodo limitarlo a 3 dígitos, --- ## Cargando paquetes frecuentes <br><br> Para un uso personal, puede ser útil configurar el llamado de algunos paquetes cada vez que inicias sesión. Por ejemplo: - Asegúrate de tener instalado el paquete dplyr. - Abre el archivo .Rprofile - Agrega el código: library(dplyr) dentro del archivo. - Guarda los cambios y reinicia la sesión. - Notarás que en la consola aparece el mensaje "Attaching package: ‘dplyr’". ??? Si eres un amante del tidyverse, es probable que cada uno de tus scripts de R comiencen con library(tidyverse) o al menos con library(dplyr) o library(ggplot2). --- ## Asignación de sobrenombres a las funciones <br> - Abre tu archivo .Rprofile. - Reemplacemos la función sum con su nombre en español suma: ```r suma <- sum ``` - Guarda los cambios y reinicia la sesión. - Ahora usa la función suma. ```r suma(1,2) ``` Ten presente, que este sobrenombre únicamente va a funcionar para tu usuario o computadora, incluso puede ser usado en un proyecto específico. ??? En ocasiones nos encontramos con funciones que tienen nombres bastante elaborados o que nos cuesta trabajo recordar. Para este fin, podemos asignarles un sobrenombre dentro del .Rprofile que podemos aplicar a cualquier Rscript dentro de la sesión. Veamos un ejemplo: --- ## Creando mensajes de error personalizados - Abre el archivo .Rprofile - Agrega el siguiente código: ```r options(error= function() cat(' \\\ Sigue intentando! \n \\\ /\\_/\\ ( o.o ) > ^ <\n\n')) ``` - Guarda los cambios y reinicia la sesión. - Ahora generemos un error a propósito. ```r suma('a') ``` .center[¿Notas el resultado?] ??? Si necesitas un poco de ánimos para seguir escribiendo tu código, puedes agregar algunos mensajes personalizados de error. --- ## Mensajes de bienvenida <br> Para generar mensajes de bienvenida y/o despedida de tu sesión, usaremos el siguiente código como base dentro de tu .Rprofile: ```r if (interactive()) { .First <- function() { # aquí van los mensajes o las funciones para la bienvenida } .Last <- function() { # aquí van los mensajes o las funciones para la despedida } ``` --- ## Mensajes de bienvenida Agreguemos un mensaje de bienvenida sencillo: - Abre tu archivo .Rprofile usando usethis::edit_r_profile() - Agrega el siguiente código: ```r if (interactive()) { .First <- function() { print("Hola!") } } ``` - Guarda los cambios y reinicia la sesión. .center[¿Se ve el mensaje en tu consola?] --- ## Mensajes de bienvenida Puedes usar la función saludo::saludo() del paquete privado que instalaste previamente para generar saludos aleatorios. - Abre tu archivo .Rprofile usando - Agrega el siguiente código: ```r if (interactive()) { .First <- function() { print(saludo::saludo()) } } ``` - Guarda los cambios y reinicia la sesión un par de veces. .center[¿Cómo se ve la bienvenida ahora?] ??? Recuerda que en este archivo usamos código de R, así que podemos llamar a las funciones de los paquetes que tenemos instalados. Por ejemplo, puedes usar la función saludo::saludo() del paquete privado que instalaste previamente para generar saludos aleatorios. --- ## Mensajes de bienvenida Si eres amante de los animales, puedes usar el paquete cowsay para generar imágenes de diversos animales usando código ASCII. Puedes instalarlo desde CRAN usando ```r install.packages("cowsay") ``` - Veamos la lista de animales disponibles usando ```r names(cowsay::animals) ``` ``` ## [1] "cow" "chicken" "chuck" "clippy" "poop" ## [6] "bigcat" "ant" "pumpkin" "ghost" "spider" ## [11] "rabbit" "pig" "snowman" "frog" "hypnotoad" ## [16] "shortcat" "longcat" "fish" "signbunny" "facecat" ## [21] "behindcat" "stretchycat" "anxiouscat" "longtailcat" "cat" ## [26] "trilobite" "shark" "buffalo" "grumpycat" "smallcat" ## [31] "yoda" "mushroom" "endlesshorse" "bat" "bat2" ## [36] "turkey" "monkey" "daemon" "egret" "duckling" ## [41] "duck" "owl" "squirrel" "squirrel2" ``` --- ## Mensajes de bienvenida .pull-left[ - Para obtener el código ASCII de los animales podemos usar ```r cowsay::animals["rabbit"] ``` <img src="data:image/png;base64,#img/bunny.png" width="80%" style="display: block; margin: auto;" /> ] .pull-right[ - Si eres fan de Star Wars, puedes usar el paquete starwarssay desarrollado por Erick Cuevas. Puedes instalarlo desde GitHub usando ```r remotes::install_github("Erickcufe/starwarssay") ``` <img src="data:image/png;base64,#img/r2d2.png" width="30%" style="display: block; margin: auto;" /> ] --- class: chapter-slide # Es tu turno! Realiza la Actividad 3<br>10 min --- ## Generando un .Rprofile para cada proyecto <br><br> Así como puedes tener un archivo .Renviron para cada proyecto, también puedes tener un .Rprofile específico para cada proyecto de RStudio. Para generar un .Rprofile dentro de un proyecto usa el comando ```r usethis::edit_r_profile("project") ``` ??? Hasta el momento hemos modificado el .Rprofile general de tu usuario, por lo que el código se ejecutará al abrir cualquier sesión de R dentro de tu computadora, pero así como puedes tener un archivo .Renviron para cada proyecto, también puedes tener un .Rprofile específico para cada proyecto de RStudio. --- class: chapter-slide # Es tu turno! Realiza la Actividad 4<br>10 min --- ## Reproducibilidad <br> - Toma en cuenta que las configuraciones que hagas en tu .Rprofile solamente funcionarán dentro de tu usuario y computadora. - Normalmente se incluye código que no afecta el comportamiento de un análisis. - Ten cuidado si cargas paquetes como dplyr o ggplot2. - Puedes generar un archivo .Rprofile del proyecto y compartir este archivo dentro de tu repositorio. ??? Mantén presente que si compartes tu código es probable que las funciones de estos paquetes no funcionen en otra computadora, a menos que los llames de forma explícita dentro de tu código.