Hola colega.
Bienvenida, bienvenido al primer número de ?R, el newsletter de Data Crunchers en el que cada semana te compartiré tips y recursos sobre este increíble lenguaje de programación.
Arranquemos...
Si alguna vez has cargado el paquete {tidyverse} usando la función library(), seguro haz visto un mensaje como este:
Aunque la primera mitad es relativamente fácil de entender (R nos avisa que cargó los paquetes medulares que integran el {tidyverse}), la última parte del mensaje es un tanto críptica e intimidante.
¿Conflictos? ¿Por qué?
Vamos por partes.
Supongamos que al iniciar una nueva sesión de R:
-
Automáticamente se cargan siete paquetes (lo cual es técnica –y ñoñamente– cierto)...
-
Uno de estos paquetes se llama {stats}...
-
Y que una de las funciones de este paquete es filter().
Ahora supongamos que unos segundos después cargamos el
{tidyverse}.
Al hacerlo, además estamos cargando el paquete {dplyr}, y este último incluye una función que también se llama filter().
Colegas, sin proponérnoslo, le acabamos de generar un "problema" a R 🤯, porque a partir de este punto hay dos paquetes cargados que contienen una función que se llama filter().
En términos técnicos, acabamos de propiciar un conflicto entre las funciones filter() de ambos paquetes.
Empty space, drag to resize
Nota bene
Este breve ejemplo con las funciones filter() de los paquetes {stats} y {dplyr} ilustra un fenómeno general.
Siempre que cargues dos paquetes con al menos una función homónima, surgirá un conflicto entre dichas funciones.
Puedes probarlo iniciando una nueva sesión de R, y después cargando los paquetes {dplyr} y {MASS}, en ese orden, con la función library().
Y esto nos lleva al siguiente punto...
¿Cuál de las dos funciones homónimas usará R?
Por default, cuando surge un conflicto entre las funciones de dos paquetes, R usará la función incluida en el último paquete que hayas cargado.
Esto se conoce como enmascaramiento 😮.
Siguiendo con el ejemplo hipotético de arriba, dado que cargamos {dplyr} después de {stats}, a partir de este punto R usará la función filter() de {dplyr}; y la del paquete {stats} quedará "desactivada" durante el resto de tu sesión.
Más abajo👇 te explico qué puedes hacer si quieres seguir usando una función que fue enmascarada y desactivada por otra.
¿Por qué debería importarte todo este choro?
Si ocurre un conflicto entre funciones y no te das cuenta de ello, puedes acabar en una situación muy frustrante y confusa: escribes el nombre de una función, esperas que tenga cierto comportamiento porque piensas que pertenece a un paquete en específico, pero al ejecutar el código o el resultado no es el que esperas, o te aparece un mensaje de error y no entiendes por qué.
El choro de arriba te ofrece una buena herramienta para identificar el posible origen del problema.
¿Qué cómo solucionas un posible conflicto entre funciones?
Me da gusto que lo preguntes 😉.
En los siguientes tips te ofrezco un par de alternativas y en los recursos menciono un paquete que puede serte útil.
La primera opción para lidiar con el conflicto entre las funciones homónimas de dos paquetes, requiere seguir estos sencillos pasos:
-
Paso 1: Reinicia tu sesión de R. Puedes hacerlo con Session > Restart R, o bien con el atajo Ctrl + Shift + F10 (Windows) o Command + Shift + 0 (Mac)
-
Paso 2: Vuelve a cargar los paquetes, asegurándote que el que contiene la función que quieres usar durante tu sesión se cargue después del otro paquete que contiene la función homónima
Retomando el ejemplo de antes, si la versión de filter() que quieres mantener "activa" y utilizar corresponde a la del paquete {dplyr}, entonces debes cargar este paquete después de {stats} y con ello habrás resuelto el "problema".
La alternativa de arriba es útil si únicamente quieres/necesitas usar una de las dos funciones homónimas (p. ej., filter()) durante una misma sesión de R.
¿Pero qué pasa si debes usar las dos versiones de una función homónima, y una está enmascarada y desactivada por la otra?
La solución consiste en usar la siguiente sintaxis:
para indicarle explícitamente a R a qué paquete pertenece la función que quieres utilizar.
Considerando el ejemplo que he usado hasta ahora, si cargas {dplyr} después de {stats} y en algún punto de tu análisis necesitas usar la función filter() de este último paquete, puedes hacerlo escribiendo:
Nota bene
Además de permitirte usar funciones enmascaradas/desactivadas, la sintaxis paquete::función tiene una ventaja adicional: con ella puedes usar funciones de paquetes que no has cargado en tu sesión 😎.
¿Quieres iniciar tu camino en el mundo de R en un curso gratuito con más de 1:30 hrs. de clases pregrabadas, ejercicios de práctica y evaluaciones?
Si la respuesta es sí, R y RStudio 101 es para ti (liga).
Para tener acceso al mismo, sólo tienes que crear una cuenta en nuestra plataforma de Data Crunchers (allá arriba 👆) y listo.
Existen al menos dos funciones útiles para identificar qué funciones tienen uno o más conflicto con otras funciones homónimas.
La primera es conflicts(). Ésta te permite conocer la lista de todas las funciones que tienen al menos un conflicto.
La segunda es find(), misma que nos muestra con qué paquetes y funciones homónimas tiene conflictos una función en particular.
Supongamos de nueva cuenta que iniciamos una sesión "fresca" de R, que automáticamente se cargan los siete paquetes de cajón, y que después cargamos el {tidyverse}.
Si ahora escribes y ejecutas la función conflicts(), deberías ver algo como esto:

Imaginemos que nos interesa saber a qué paquetes pertenecen las funciones tribble() que tienen un conflicto. Lo podemos averiguar con find(what = "tribble") y el resultado se verá de la siguiente forma:

Listones. Poder desbloqueado 🥷.
Si quieres aprender otras formas de lidiar con los conflictos entre funciones homónimas, te recomiendo que le eches un ojo al paquete {conflicted} (liga), creado por sensei Hadley Wickham.
Es todo por hoy, colega.
Saludos y nos leemos pronto,
~ Sebastián
Empty space, drag to resize
Postdata
Dicen que uno planea y los dioses se ríen...
Y vaya que se rieron de mí cuando hace poco más de un año anuncié que arrancaría un nuevo proyecto: ?R, el newsletter de Data Crunchers.
Bueno, pues 12 meses después, éste fue su primer número.
Espero que te sea útil.
Como siempre, cualquier comentario, sugerencia y/o queja es bienvenido.