Pregunta Frecuente: ¿Cómo hacer un ejemplo mínimo reproducible (reprex)? - para principiantes

Un ejemplo mínimo reproducible consiste de los siguientes puntos:

  • Un conjunto de datos mínimo que permita reproducir el problema.
  • El mínimo código ejecutable necesario para reproducir el problema, que pueda
    ser ejecutado con el conjunto de datos brindado y que incluya la
    información necesaria sobre los paquetes utilizados.

Vayamos rápidamente sobre cada uno de estos puntos con ejemplos:

Conjunto de Datos Mínimo (Datos de Muestra)

Usted necesita proporcionar un conjunto de datos que sea lo suficientemente pequeño para ser pegado (razonablemente) en una publicación, pero lo suficientemente grande para reproducir el problema.

Digamos, a manera de ejemplo, que usted está trabajando con el conjunto de datos iris.

head(iris)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          5.1         3.5          1.4         0.2  setosa
#> 2          4.9         3.0          1.4         0.2  setosa
#> 3          4.7         3.2          1.3         0.2  setosa
#> 4          4.6         3.1          1.5         0.2  setosa
#> 5          5.0         3.6          1.4         0.2  setosa
#> 6          5.4         3.9          1.7         0.4  setosa

Nota: En este ejemplo estamos utilizando el conjunto de datos iris incorporado por defecto en R, como una representación de sus datos reales, usted debe usar su propio conjunto de datos en lugar de iris, o, si el problema puede reproducirse con cualquier conjunto de datos, entonces usted puede utilizar iris directamente (o cualquier otro de los conjuntos de datos incorporados en R, por ejemplo, mtcars, ToothGrowth, PlantGrowth, USArrests, etc.) y saltarse este paso.

Y está teniendo problemas mientras trata de hacer un gráfico de dispersión entre las variables Sepal.Length y Sepal.Width, entonces, unos buenos datos de muestra mínimos para este caso, serían solo las primeras cinco filas de esas dos variables, esto no significa que deba hacer necesariamente lo mismo, utilice su mejor criterio para decidir la cantidad mínima de datos de muestra necesarios para ejemplificar su problema específico.

head(iris, 5)[, c('Sepal.Length', 'Sepal.Width')]
#>   Sepal.Length Sepal.Width
#> 1          5.1         3.5
#> 2          4.9         3.0
#> 3          4.7         3.2
#> 4          4.6         3.1
#> 5          5.0         3.6

Ahora solo necesita poner esto en un formato fácil de copiar/pegar para ser publicado en el foro, y puede hacerlo fácilmente con el paquete datapasta.

# Si no lo ha hecho aún, primero tiene que instalar datapasta con
# install.packages("datapasta")
datapasta::df_paste(head(iris, 5)[, c('Sepal.Length', 'Sepal.Width')])
# Estos son los datos de muestra que tiene que usar en su ejemplo reproducible.
data.frame(
      Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5),
       Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6)
   )

Aquí puede encontrar una buena guía acerca de datapasta:

Otra opción útil en ciertos casos es utilizar dput que está disponible como una función R estándar y es tan simple como:

dput(head(iris, 5)[c("Sepal.Length", "Sepal.Width")])
#> structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5), Sepal.Width = c(3.5, 
#> 3, 3.2, 3.1, 3.6)), row.names = c(NA, 5L), class = "data.frame")

Este resultado puede parecer extraño comparado con el resultado de datapasta, pero es mucho más general en el sentido de que soporta muchos mas tipos de objetos R.

Código Mínimo Ejecutable

El siguiente paso es armar un ejemplo mínimo del código que le está causando problemas, y los paquetes que está utilizando para ese código, por favor limite el código a solo la parte relevante e indispensable para reproducir el problema.

# Asegúrese de incluir llamadas a librerías para todos los paquetes que está utilizando en su ejemplo.
library(ggplot2)

# Recuerde incluir los datos de muestra que generó en el paso anterior.
df <- data.frame(stringsAsFactors = FALSE,
                 Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5),
                 Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6)
)

# Limite su código a sólo la parte problemática.
ggplot(data = df, x = Sepal.Length, y = Sepal.Width) +
    geom_point()
#> Error: geom_point requires the following missing aesthetics: x, y

Su Ejemplo Reproducible Final

Ahora que tiene un ejemplo mínimo reproducible que muestra su problema, es tiempo de ponerlo en un formato adecuado para ser publicado en el foro de la comunidad, esto es muy simple de hacer con el paquete reprex, simplemente copie su código con Ctrl + c y ejecute el comando reprex() en su panel de consola R.

# Si aún no lo ha hecho, primero tiene que instalar reprex con
# install.packages("reprex")
reprex::reprex()

Ahora puede simplemente hacer Ctrl + v en su publicación del foro y voilà!, tiene un ejemplo reproducible formatedo adecuadamente, como este:

```{r}
library(ggplot2)

df <- data.frame(stringsAsFactors = FALSE,
                 Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5),
                 Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6)
)
ggplot(data = df, x = Sepal.Length, y = Sepal.Width) +
    geom_point()
#> Error: geom_point requires the following missing aesthetics: x, y
```

![](https://i.imgur.com/rAYQlnn.png)

Nota: El enfoque anterior funciona si está utilizando una versión de escritorio de RStudio, pero si usted está utilizando una versión de servidor (y no tiene acceso al porta papeles), tendrá que pegar su código dentro de la función reprex() de esta manera.

reprex::reprex({
library(ggplot2)

df <- data.frame(stringsAsFactors = FALSE,
                 Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5),
                 Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6)
                 )

ggplot(data = df, x = Sepal.Length, y = Sepal.Width) +
    geom_point()
})

Otro punto que resaltar aquí, es que reprex no se ejecuta por defecto en su directorio de trabajo, crea un directorio de trabajo temporal y, por lo tanto, si usted lee archivos ubicados en su directorio de trabajo utilizando rutas relativas, va a obtener errores, la forma preferible para evitar esto es compartir sus datos en un formato fácil de copiar y pegar utilizando datapasta o dput (como se muestra en la primera sección), pero en caso de que no pueda hacerlo, usted puede forzar a reprex a utilizar el directorio de trabajo actual utilizando el argumento outfile = NA, esto no será reproducible ya que la gente no tiene acceso a sus archivos locales y por lo tanto tendrá que compartir sus datos utilizando algún servicio de almacenamiento en la nube como, por ejemplo, Dropbox, Google Drive, etc.

La Solución

Si usted sigue todos estos pasos, muy probablemente, alguien va a copiar su código en su propia sesión de RStudio, descubrirá cual es el problema, en este ejemplo sería que usted olvidó poner sus variables dentro de la función aes(), y le responderá con una solución funcional como esta.

library(ggplot2)

df <- data.frame(stringsAsFactors = FALSE,
                 Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5),
                 Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6)
                 )

ggplot(data = df, aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_point()

2 Likes