+ - 0:00:00
Notes for current slide
Notes for next slide

Conquistando errores con R

Pao Corrales

LatinR 2022

11 de octubre de 2022

1 / 20

Hola!

@paobcorrales

paocorrales.github.io

2 / 20

Mapa de ruta

3 / 20

Mapa de ruta

  • Los mensajes no son errores, los warnings tampoco (a veces)
3 / 20

Mapa de ruta

  • Los mensajes no son errores, los warnings tampoco (a veces)

  • Errores en cadenas de código (team %>% o |>)

3 / 20

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))))

3 / 20

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

3 / 20

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

3 / 20

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/

Estas slides: paocorrales.github.io/errores_tutorial/slides/errores-presentacion.html

3 / 20

Interpretando a R

Este es un mensaje:

library(data.table)
##
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
##
## between, first, last
4 / 20

Interpretando a R

Éste es un warning o advertencia:

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
5 / 20

Interpretando a R

Éste es un error:

date[5]
## Error in date[5]: object of type 'closure' is not subsettable
6 / 20

Interpretando a R

Éste es un error:

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!

6 / 20

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!

7 / 20

Errores en cadenas de código

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.

8 / 20

Errores en código anidado

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.
9 / 20

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.

10 / 20

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

11 / 20

¿Arrancamos?

Si lograste abrir el proyecto de RStudio usá la reacción 👍

Si tuviste algún problema levantá la mano ✋

12 / 20

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.
13 / 20

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.

13 / 20

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).)

13 / 20

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.

13 / 20

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.

14 / 20

Pausa

Aprovechá para levantarte de la silla y estirar un poco!

05:00
15 / 20

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.
16 / 20

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.

16 / 20

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().

16 / 20

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.

17 / 20

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.

18 / 20

Reprex (reproducible example)

  • 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?

  1. Adaptá tu código para que sea reproducible y autocontenido.
  2. Copiá el código necesario.
  3. Corré reprex().
  4. Revisá la salida localmente.
  5. Copia todo en GitHub/Slack/etc.
  6. Esperá.

Para saber más:

19 / 20

¿Dudas?

20 / 20

Hola!

@paobcorrales

paocorrales.github.io

2 / 20
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow