class: center, middle, inverse, title-slide .title[ # Conquistando errores con R ] .author[ ### Pao Corrales ] .institute[ ### LatinR 2022 ] .date[ ### 11 de octubre de 2022 ] --- class: center ## Hola! <img src="img/pao_circle.png" width="30%" /> @paobcorrales [paocorrales.github.io](https://paocorrales.github.io/) --- ## Mapa de ruta -- * Los mensajes no son errores, los warnings tampoco (a veces) -- * Errores en cadenas de código (team ` %>% ` o `|>`) -- * Errores en código anidado (`mean(sd(random(n)))`) -- * Errores en loops y funciones -- * Qué hacer cuando todo lo anterior no funciona -- #### Estos materiales Página web: [paocorrales.github.io/errores_tutorial/](https://paocorrales.github.io/errores_tutorial/) Estas slides: [paocorrales.github.io/errores_tutorial/slides/errores-presentacion.html](https://paocorrales.github.io/errores_tutorial/slides/errores-presentacion.html) --- ## Interpretando a R Este es un mensaje: ```r library(data.table) ``` ``` ## ## Attaching package: 'data.table' ``` ``` ## The following objects are masked from 'package:dplyr': ## ## between, first, last ``` --- ## Interpretando a R Éste es un warning o advertencia: ```r x <- c(1, 3) y <- c(1, 2, 3, 4, 5) z <- x == y ``` ``` ## Warning in x == y: longer object length is not a multiple of shorter object ## length ``` --- ## Interpretando a R Éste es un error: ```r date[5] ``` ``` ## Error in date[5]: object of type 'closure' is not subsettable ``` -- ------------------------------------------------------------ R y RStudio necesitan usar distintos colores para mensajes, advertencias y errores. Mientras tanto, rojo/naranja no implica necesariamente error! --- ## Antes de continuar... vayamos preparando R Para trabajar localmente 💻: http://tiny.cc/proyecto-debugging Para trabajar en RStudio Cloud ☁️: https://rstudio.cloud/content/4706056 👉 ¿Dudas? ¿Problemas? Escribilos en el chat y te ayudamos! --- ## Errores en cadenas de código ```r pinguinos %>% mutate(dim_pico = largo_pico_mm + alto_pico_mm) %>% group_by(especie, sexo) %>% summarise(pico_promedio = mean(dim_pico)) %>% pivot_wider(names_from = "especie", values_from = c("pico_promdio")) ``` ``` ## `summarise()` has grouped output by 'especie'. You can override using the ## `.groups` argument. ``` ``` ## Error in `chr_as_locations()`: ## ! Can't subset columns that don't exist. ## ✖ Column `pico_promdio` doesn't exist. ``` * ¿Devuelve un mensaje de error? - ¿Qué dice el error? ¿Menciona el número de línea o la función que genera problemas? * ¿El resultado no es el esperado? - ¿La variable (un data.frame?) de entrada tiene la pinta que debería tener? Si el error no se resuelve, correr las líneas de código de forma incremental suele ayudar. --- ## Errores en código anidado ```r y <- runif(15) y[y > max(sample(runif(15) 0))] ``` ``` ## Error: <text>:3:28: unexpected numeric constant ## 2: ## 3: y[y > max(sample(runif(15) 0 ## ^ ``` * ¿Devuelve un mensaje de error? - ¿Están todos los paréntesis y corchetes necesarios? * ¿El resultado no es el esperado? - ¿La variable de entrada tiene la pinta que debería tener? Acá la estrategía es correr el código de adentro hacía afuera y revisar: * ¿Estoy usando los argumentos correctos en cada función? * En qué momento da error o el resultado no es correcto. --- ## Errores en funciones y loops * Puede ser más complejo encontrar el error porque - el código es más complejo - el código se corre en bloque, en vez de línea por línea - el error puede ocurrir sólo en alguna iteración en particular Necetamos algunas herramientas extras para entender el contexto en el que ocurre el error y poder resolverlo. --- class: center, middle > ### Encontrar tu bicho es un proceso de confirmación de las muchas cosas que crees que son ciertas, hasta que encuentras una que no lo es. > > #### Norm Matloff --- ## ¿Arrancamos? Si lograste abrir el proyecto de RStudio usá la reacción 👍 Si tuviste algún problema levantá la mano ✋ --- ## Algunas funciones * `debugonce()`: permite explorar de manera interactiva el entorno creado en una función la próxima vez que ejecutemos esa función. Tendremos acceso a las variables y el "estado" del código en cada momento. -- * `debug()`: es similar a la anterior pero se activará *cada vez* que ejecutemos la función. -- * `options(error = recover)`: en caso de encontrase con un error, devuelve el listado de pasos previos y permite interactuar con el código. (Se revierte con `options(error = NULL)`.) -- * `browser()`: la ejecución del código se detiene cuando encuentra la función `browser()` permitiendo trabajar interactivamente en el ambiente generado por la función o código. --- ## Ejercicio 1 Ahora les toca a ustedes! * Abrir el archivo `palindromos.R` disponible en el proyecto. * Cargar todas las funciones usando el botón Source o corriendo el código. La función `palindromo_grande()` busca el palíndromo más grande que se genera al multiplicar 2 números de 3 dígitos. Un palíndromo (o capicúa) es un número que tiene la misma pinta si se lee de derecha a izquierda o de izquierda a derecha. Por ejemplo 24542. * La función `palindromo_grande()`, ¿da el resultado esperado? Usando la función `debugonce()` aplicada a `palindromo()`: * Exploren el funcionamiento del código y las variables internas. * ¿Las variables tienen el valor esperado? **Objetivo:** Encontrar la ubicación del error. Si entienden cual es el problema, pueden arreglarlo. --- class: center, inverse, middle background-image: url("img/ladybug.png") background-size: contain # Pausa Aprovechá para levantarte de la silla y estirar un poco!
05
:
00
--- ## Algunas funciones * “Show traceback”: Muestra el “paso a paso” del código. Cuando llamamos a varias funciones, muestra en que orden son llamadas. Se lee de abajo para arriba. -- * `traceback()`: es la función que corre por debajo de la mesa cuando usamos "Show traceback". También sirve cuando no estamos dentro de RStudio. -- * `rlang::last_trace()`: También muestra el "paso a paso" del código. El orden es al revés que con `traceback()`. --- ## Ejercicio 2 Ahora les toca a ustedes! * Abrir el archivo `cor_negativa.R` disponible en el proyecto. * Cargar todas las funciones usando el botón Source o corriendo el código. El código devolverá un mensaje de error cuando prueben la función usando el código de prueba que está al final del archivo. * Si corrieron las funciones una a una, no aparecerá el botón que muestra el traceback o la opción para correr el código nuevamente en modo debugging. Tendrán que usar `traceback()` y `debugonce()`. * Si hicieron source del código autmáticamente veran los botenes "Show Traceback" y "Rerun with Debug" **Objetivo:** Encontrar la ubicación del error. Si entienden cual es el problema, pueden arreglarlo. --- ## Qué hacer cuando todo lo anterior no funciona Hay errores testarudos que no se resuelven fácilmente. Otras veces el error está en una función de un paquete y no podemos resolverlo. Siempre está google: * Buscar el error (sin nombres de variables o información específica) * Hay más opciones en inglés que en español :( Podés cambiar el idioma con `Sys.setenv(LANGUAGE = "en_US")` y correr el código de nuevo para obtener el mensaje en inglés. Pero siempre, siempre está la comunidad de R para pedir ayuda: * En un slack (RLadies, LatinR, R4DS) * Community de RStudio * Twitter: #RStats, #RStatES * StackOverflow Pero **"Me da un error"** no es suficiente para entender el error y encontrar una solución. Idealmente necesitamos generar un ejemplo que reproduzca el error y podamos compartir. --- ## Reprex (**re**producible **ex**ample) * El código debe ser autocontenido. * Es preferible usar datos que vienen con R o generados sintéticamente. * Incluí solo lo necesario. * Respetá la computadora de tus colegas. * Incluye la salida que genera el código. ### ¿Cómo se usa? 0. Adaptá tu código para que sea reproducible y autocontenido. 1. Copiá el código necesario. 2. Corré `reprex()`. 3. Revisá la salida localmente. 4. Copia todo en GitHub/Slack/etc. 5. Esperá. Para saber más: * [Cómo hacer un buen ejemplo reproducible en R](https://eliocamp.github.io/codigo-r/2018/01/buen-ejemplo-reproducible-en-r/) * [Help me help you. Creating reproducible examples](https://www.rstudio.com/resources/webinars/help-me-help-you-creating-reproducible-examples/) --- class: center, inverse, middle background-image: url("img/ladybug.png") background-size: contain # ¿Dudas?