04 - Guía búsqueda de ayuda

En esta guía vamos a revisar algunos tips y recursos para buscar ayuda efectivamente, en el contexto de proyectos de análisis de datos.

Leer archivos de ayuda de R

Todas las funciones en R tienen un archivo de ayuda asociado. Podemos acceder a estos simplemente antecediendo el nombre de la función con un signo de interrogación:

?mean

?`%>%` # con estos tildes invertidos podemos ingresar funciones que tengan caracteres especiales

?`%in%`

Podemos leer un archivo de ayuda de R de la siguiente forma:

Traducido de [Healy (2018)](https://socviz.co/appendix.html).

Figure 1: Traducido de Healy (2018).

Encontrar funciones en línea

CRAN packages

CRAN es el sitio de los repositorios oficiales de R. La página web es un poco confusa, pero usualmente encontramos los paquetes que queremos buscando en Google cran <paquete>. Por ejemplo, este es el sitio para el paquete dplyr.

Contiene información útil sobre el paquete. Tres campos muy importantes a mirar son (a) “URL”, que nos lleva al sitio oficial del paquete, usualmente en la página del autor/a, (B) “Vignettes”, que son pequeñas guías oficiales de cómo usarlo y (C) “Reference manual”, un manual con todos los archivos de ayuda de sus funciones.

rdocumentation.org

En este sitio podemos buscar funciones y mirar sus archivos de ayuda en línea. Prueba a buscar alguna función conocida (por ejemplo, mutate, arrange, select, etc.). En la columna de la derecha aparecerán las funciones, mientras que la de la izquierda mostrará paquetes relacionados con nuestra búsqueda.

CRAN Task Views

CRAN Task Views son guías muy completas sobre qué paquetes nos pueden ayudar a lidiar con tópicos específicos. Por ejemplo, veamos el CTV de “Estadística para las Ciencias Sociales”.

Solucionar problemas

Problemas con paréntesis y comas

Vamos a usar una base de ejemplo de ggplot2, llamada midwest. Contiene información demográfica sobre distintos condados en Estados Unidos, parte de la zona geográfica llamada “Midwest”.

midwest
## # A tibble: 437 x 28
##      PID county state  area poptotal popdensity popwhite popblack popamerindian popasian popother percwhite percblack percamerindan percasian percother popadults perchsd percollege percprof poppovertyknown percpovertyknown percbelowpoverty
##    <int> <chr>  <chr> <dbl>    <int>      <dbl>    <int>    <int>         <int>    <int>    <int>     <dbl>     <dbl>         <dbl>     <dbl>     <dbl>     <int>   <dbl>      <dbl>    <dbl>           <int>            <dbl>            <dbl>
##  1   561 ADAMS  IL    0.052    66090      1271.    63917     1702            98      249      124      96.7    2.58          0.148     0.377     0.188      43298    75.1       19.6     4.36           63628             96.3            13.2 
##  2   562 ALEXA~ IL    0.014    10626       759      7054     3496            19       48        9      66.4   32.9           0.179     0.452     0.0847      6724    59.7       11.2     2.87           10529             99.1            32.2 
##  3   563 BOND   IL    0.022    14991       681.    14477      429            35       16       34      96.6    2.86          0.233     0.107     0.227       9669    69.3       17.0     4.49           14235             95.0            12.1 
##  4   564 BOONE  IL    0.017    30806      1812.    29344      127            46      150     1139      95.3    0.412         0.149     0.487     3.70       19272    75.5       17.3     4.20           30337             98.5             7.21
##  5   565 BROWN  IL    0.018     5836       324.     5264      547            14        5        6      90.2    9.37          0.240     0.0857    0.103       3979    68.9       14.5     3.37            4815             82.5            13.5 
##  6   566 BUREAU IL    0.05     35688       714.    35157       50            65      195      221      98.5    0.140         0.182     0.546     0.619      23444    76.6       18.9     3.28           35107             98.4            10.4 
##  7   567 CALHO~ IL    0.017     5322       313.     5298        1             8       15        0      99.5    0.0188        0.150     0.282     0           3583    62.8       11.9     3.21            5241             98.5            15.1 
##  8   568 CARRO~ IL    0.027    16805       622.    16519      111            30       61       84      98.3    0.661         0.179     0.363     0.500      11323    76.0       16.2     3.06           16455             97.9            11.7 
##  9   569 CASS   IL    0.024    13437       560.    13384       16             8       23        6      99.6    0.119         0.0595    0.171     0.0447      8825    72.3       14.1     3.21           13081             97.4            13.9 
## 10   570 CHAMP~ IL    0.058   173025      2983.   146506    16559           331     8033     1596      84.7    9.57          0.191     4.64      0.922      95971    87.5       41.3    17.8           154934             89.5            15.6 
## # ... with 427 more rows, and 5 more variables: percchildbelowpovert <dbl>, percadultpoverty <dbl>, percelderlypoverty <dbl>, inmetro <int>, category <chr>

Generemos un gráfico con ella:

ggplot(data = midwest, 
       mapping = aes(x = as.factor(inmetro), y = percbelowpoverty)) +
  geom_boxplot() +
  labs(title = "Relación entre carácter metropolitano y pobreza en los condados del Midwest",
       caption = "Fuente: Wickham (2018)",
       x = "Carácter metropolitano", y = "Porcentaje de pobreza")

La gran mayoría de los errores que se cometen en R tienen que ver con sintaxis. Como hemos visto, R (como cualquier lenguaje de programación) espera instrucciones muy precisas de nuestra parte. Aquí algunos tips para detectar problemas de este tipo:

  • Revisar dónde abren/cierran paréntesis sospechosos. Si ponemos el teclado al lado de uno de ellos, RStudio resaltará el paréntesis par a este:

  • Con respecto a las comas, debemos recordar que se utilizan para separar argumentos de funciones, por lo que siempre deben estar adentro de ellas. Fíjate en los argumentos de la función labs() en el código de arriba.

  • Otro error de sintaxis es dejar cadenas de código (%>% o +) abiertas. Esto es, dejar un pipe o “+” extra al final. R seguirá esperando la continuación de la cadena!

  • Un truco para ver dónde está fallando nuestro código es “ponerle sangría” línea a línea. Si tenemos un código desordenado, podemos ir ordenándolo línea a línea con Ctrl + I. Probablemente esto nos dé una mejor perspectiva para encontrar errores de comas, pipes, etc:

Leer los mensajes de error de R

Veamos el siguiente error, cuando intentamos filtrar solo los condados de Illinois en la base de ejemplo:

midwest %>% 
  filter(state = "IL")
## Error: Problem with `filter()` input `..1`.
## x Input `..1` is named.
## i This usually means that you've used `=` instead of `==`.
## i Did you mean `state == "IL"`?

¿Cuál es la solución al problema? En este caso el mensaje de error es muy claro, teníamos que usar el operador lógico ==, en vez de solo =.

Buscar en internet

La mayoría de la veces, los errores que devuelve R son difíciles de entender, a diferencia del ejemplo anterior. Una buena idea es buscar el error en Google (la mayoría de los errores ya han sido preguntados en línea), acompañado de la función y/o paquete.

Para hacer estas búsquedas eficientemente, deberíamos eliminar cualquier información del error que sea específica de nuestra base de datos (“generalizándolo”). Por ejemplo, una buena búsqueda para el error anterior podría ser la siguiente. También eliminamos símbolos especiales (como ==), que seguramente Google no tomará en cuenta.

r dplyr filter must not be named, do you need

En Google podemos poner una palabra o frase entre comillas para que los resultados deban necesariamente contenerla tal como está escrita. Podríamos buscar algo como esto:

r dplyr filter “must not be named, do you need”

Por lejos, los mejores resultados vienen de StackOverflow, un sitio web de preguntas y respuestas de programación. En Google a menudo querrán clickear en “Más resultados de stackoverflow.com”, si es que no encuentran la solución en los primeros resultados. Podemos hacer nuestra búsqueda anterior directamente en StackOverflow a través de Google, de la siguiente forma:

site:stackoverflow.com dplyr filter “must not be named, do you need”

Pedir ayuda con ejemplos reproducibles (reprex)

Cuando tenemos un problema y queremos compartirlo con alguien (colegas, StackOverflow, etc.), lo ideal es que generemos un ejemplo mínimo que reproduzca nuestro problema (reprex).

  • La idea es que la otra persona no tenga que lidiar con todo nuestro código, sino que solo con la parte que nos está dando problemas.

  • Adicionalmente, no queremos que esa otra persona tenga que entender nuestra base de datos en particular, por lo que los reprex usualmente están hechos con bases de datos pequeñas creadas o con bases de datos que vienen por defecto con R o el tidyverse (mtcars, midwest, mpg, diamonds, etc.).

  • Por último, queremos que esa otra persona pueda correr rápidamente nuestro código, sin tener que preocuparse de nada más aparte de nuestro problema.

Nuestro problema de antes:

midwest %>% 
  filter(state = "IL")
## Error: Problem with `filter()` input `..1`.
## x Input `..1` is named.
## i This usually means that you've used `=` instead of `==`.
## i Did you mean `state == "IL"`?

Utilizar la base “midwest” está bien, pero vamos a generar nuestro reprex con otra de ejemplo en el paquete ggplot2, llamada mpg. Esta base se ve de la siguiente forma. No importa mucho su contenido, pero sí que tenemos variables categóricas por las que querríamos filtrar, como por ejemplo “model”.

## # A tibble: 234 x 11
##    manufacturer model      displ  year   cyl trans      drv     cty   hwy fl    class  
##    <chr>        <chr>      <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>  
##  1 audi         a4           1.8  1999     4 auto(l5)   f        18    29 p     compact
##  2 audi         a4           1.8  1999     4 manual(m5) f        21    29 p     compact
##  3 audi         a4           2    2008     4 manual(m6) f        20    31 p     compact
##  4 audi         a4           2    2008     4 auto(av)   f        21    30 p     compact
##  5 audi         a4           2.8  1999     6 auto(l5)   f        16    26 p     compact
##  6 audi         a4           2.8  1999     6 manual(m5) f        18    26 p     compact
##  7 audi         a4           3.1  2008     6 auto(av)   f        18    27 p     compact
##  8 audi         a4 quattro   1.8  1999     4 manual(m5) 4        18    26 p     compact
##  9 audi         a4 quattro   1.8  1999     4 auto(l5)   4        16    25 p     compact
## 10 audi         a4 quattro   2    2008     4 manual(m6) 4        20    28 p     compact
## # ... with 224 more rows

Debemos pensar hacer la misma operación con la nueva base, y que nos dé el mismo error. Además, el reprex debe incluir la carga de paquetes:

library(tidyverse) # carga filter() y mpg

mpg %>% 
  filter(model = "a4")
# Error: `model` (`model = "a4"`) must not be named, do you need `==`?