Aprendiendo a usar conectores o pipes
24/11/2025
Los conectores o pipes son símbolos que nos permiten encadenar varias operaciones. En inglés, pipe significa literalmente “tubería”, porque la idea es que los datos fluyan a través de una serie de pasos.
El uso de conectores facilita la lectura del código, porque nos muestra el flujo de las operaciones de forma ordenada y lógica, y también simplifica la escritura, porque nos hace escribir en el mismo orden lógico que pensamos las operaciones, y porque además nos permite reordenar, comentar, agregar o eliminar pasos.
En R, el conector nativo es |> y a continuación veremos cómo usarlo!
Definición
Un conector conecta dos pasos del procesamiento de datos, ya sea conectando los datos a una acción, o el resultado de una acción con una nueva acción. Así que la lectura de un conector (|>) sería algo así como “luego” o “entonces”.
Pensemos en una idea de procesamiento:
Para obtener
resultado, empiezo con misdatos, y luego|>les aplico unaacción(), y luego|>les hagootra_acción()
Traduzcámosla a código:
resultado <- datos |>
acción() |>
otra_acción()
En otras palabras, se empieza con los datos, los datos se modifican una vez en el primer paso, y en el segundo paso se modifica el resultado del paso anterior. Es una cadena de operaciones con un inicio (datos) y un final (resultado).
Recordemos que, en R, el resultado (la asignación) se pone al principio, porque es una forma de decir vamos a hacer esto de la siguiente manera, una especie de título de la operación.
Escritura del conector
El conector se escribe como |>, es decir, una barra vertical | seguida de un símbolo mayor que >.
Pero recomiendo aprender el atajo de teclado para insertarlo, ya que va a ser una operación de uso muy frecuente:
|> en Mac
|> en Linux y Windows
Tipos de conectores
Si intentaste el paso anterior, puede que te haya salido un símbolo distinto 😱
En R existen dos conectores: el |> (pipe nativo de R) y el %>% (pipe del paquete {magrittr}). Ambos hacen prácticamente lo mismo.
|>
%>%
El conector que aparezca va a depender de tu configuración de RStudio: en el menú Tools, entra a Global options, y en el menú Code elige si quieres o no usar el conector nativo de R (recomendado).
Ejemplos
Veamos unos ejemplos de uso del conector en R, y cuándo resulta conveniente de usar:
Empecemos con un vector de números:
datos <- c(4, 6, 3, 7, 8, 6)
Ejemplo sin conector 👎🏼
Si tenemos un vector de números y queremos calcular su promedio:
mean(datos)
Pero si además queremos redondear el resultado (dos operaciones), tenemos que empezar a anidar las funciones:
round(mean(datos), digits = 2)
Este código se leería, de izquierda a derecha, como redondear el promedio de datos, lo cual no está mal, pero te obliga a entender la operación desde adentro hacia afuera (los datos o el inicio del proceso están al medio del código). Además, anidar las funciones empieza a hacer que el código sea cada vez menos legible. Imagínate si en vez de 2 funciones necesitas 4 o 5? 🫤
Ejemplo con conector 👍
Para hacer lo mismo pero usando conectores, encadenamos las operaciones empezando con los datos, en el orden de su ejecución:
datos |>
mean() |>
round(digits = 2)
La lectura sería: a los datos les calculo el promedio y luego al resultado lo redondeo. La operación ahora es más legible (vemos que hay claramente 3 pasos) y sigue un orden secuencial (se leen en el orden que se aplican).
Creemos una pequeña tabla de datos para el siguiente ejemplo:
# crear tabla de datos de ejemplo con tribble
library(dplyr)
datos <- tibble(animal = c("gato", "ratón", "perro", "pez", "paloma"),
color = c("gris", "negro", "blanco", "azul", "gris"),
patas = c(4, 4, 4, 0, 2),
edad = c(8, 2, 10, 1, 3))
Warning in attr(x, "align"): 'xfun::attr()' is deprecated.
Use 'xfun::attr2()' instead.
See help("Deprecated")
Warning in attr(x, "format"): 'xfun::attr()' is deprecated.
Use 'xfun::attr2()' instead.
See help("Deprecated")
| animal | color | patas | edad |
|---|---|---|---|
| gato | gris | 4 | 8 |
| ratón | negro | 4 | 2 |
| perro | blanco | 4 | 10 |
| pez | azul | 0 | 1 |
| paloma | gris | 2 | 3 |
Ejemplo sin conector 👎🏼
Imagina que a estos datos queremos hacerle varias operaciones:
- Seleccionar algunas columnas,
- filtrar algunas filas, y
- ordenar los resultados
Vamos agregando las funciones en orden: primero la selección…
select(datos, animal, patas, edad) # 🙂
Ahora el filtro, pero adentro hay que ponerle los datos seleccionados…
filter(select(datos, animal, patas, edad), patas >= 4) # 🤨
Si queremos ordenarlos tenemos que poner todo adentro de otra función…
arrange(filter(select(datos, animal, patas, edad), patas >= 4), edad) # 😵💫
Terminamos con esta aberración de paréntesis y funciones que se leen algo así como ordeno el filtro de la selección de los datos 😣 y al final van apareciendo los argumentos de cada función. Imposible de leer! 😭
Una forma de solucionarlo es ir asignando cada paso a un objeto…
datos_2 <- select(datos, animal, patas, edad)
datos_3 <- filter(datos_2, patas >= 4)
datos_4 <- arrange(datos_3, edad)
…pero esto hace que tengamos que crear muchos objetos intermedios, que no nos interesan! Además se lee muy mal porque te interrumpe la constante creación de objetos.
Ejemplo con conector 👍
Para hacer lo mismo pero usando los conectores, empezamos con los datos y vamos agregando los pasos del procesamiento: primero la selección, luego el filtro, y finalmente el ordenamiento:
datos |>
select(animal, patas, edad) |>
filter(patas >= 4) |>
arrange(edad)
El proceso queda más ordenado, se lee en orden (de arriba hacia abajo), no necesitamos crear objetos intermedios, y no hay ningún caos de paréntesis para desenredar! Mucho mejor 😊
Además, se hace mucho más fácil reordenar los pasos o agregar pasos intermedios, o bien poder poner comentarios entre medio, para ir apoyándonos en la lectura y el aprendizaje:
datos |>
# seleccionar sólo columnas útiles
select(animal, patas, edad) |>
# filtrar animales con 4 o más patitas
filter(patas >= 4) |>
# ordenarlos empeazndo por el más bebé
arrange(edad)
Solamente hay que acostumbrarse a fijarnos bien que los conectores conecten con algo: no dejar conectores apuntando a nada, porque hacen que R piense que el código conecta con lo que sea que tenga abajo, o peor, que R quede esperando que lo conectes con algo!1
-
en cuyo caso hay que tirarle cualquier cosa a la consola para que retorne error y podamos seguir con nuestras vidas ↩︎