Los pipes o tuberías (me suena fatal) están presentes en casi todos los lenguajes de programación, permiten encadenar una serie de procesos conectados de forma que la salida de uno alimenta la entrada del siguiente y facilita la legibilidad.

Este es un ejemplo básico usando la línea de comandos y el comando pipe | en Linux, listamos el contenido de un directorio, del resultado obtenemos los 3 primeros archivos y a continuación el último elemento con tail de esos tres:

$ ls | head -3 | tail -1

Creo que el paquete base de R no incluye un operador para crear pipes, pero R son sus paquetes y existen varios con este propósito.

Operadores de pipe con el paquete magrittr

En este PDF está la referencia completa del paquete descargada de este enlace.

El operador más usado es %>%, hacer esto c(1,3,4) %>% mean() es equivalente a mean(c(1,3,4)).

Para una función que acepta varios parámetros hacer x %>% f(y) es equivalente a f(x, y).

Podemos usar el operador varias veces,x %>% f %>% g %>% h es equivalente a h(g(f(x))).

A continuación genero una muestra aleatoria de 10 números usando la función de distribución normal rnorm, calculo la media y la redondeo:

x <- 10
x %>% rnorm() %>% mean() %>% round()

Otro ejemplo creando un diagrama con la función plot:

rnorm(100) %>% plot

Comandos adicionales

A pesar de que el operador %>% es el más usado del paquete magrittr este ofrece otros.

El operador %<>% ejecuta el pipe y vuelve a asignar el valor a la variable:

x <- rnorm(100)
x %<>% abs %>% sort

El operador tee %T>% se usa para devolver el valor original en vez del resultado (se lo llama “T” porque literalmente tiene la forma de una T).

rnorm(100) %>%
  matrix(ncol = 2) %T>%
  plot() %>%
  str()

La expresión de arriba solo formada por %>% hubiese retornado NULL (pruébalo).

El operador %$% se usa para exponer los nombres de las variables y hacer referencia a ellas, uso el dataset mtcars para buscar la correlación entre dos de sus variables con la función estadística cor.

mtcars %$%
  cor(disp, mpg)

Ejemplos

Ahora cargo el paquete dplyr que ofrece funciones de manipulación de datos y además incluye un dataset “storms” con datos de tormentas que usaré de ejemplo.

Uso el pipe para seleccionar dos variables del dataset usando select:

storms %>% select(wind,pressure)

Filtro el dataset usando un valor de una variable como condición con filter:

storms %>% filter(wind>=50)

Si encadeno varios operaciones se ve el potencial de los pipes:

storms %>%
  filter(wind>=50) %>%
  select(wind, pressure)

Atajo de teclado para escribir el operador %>%:

[Fuente]

Este ejemplo también es muy interesante, aplica varios pipes para obtener primero un subconjunto del dataset iris basado en los valores de una variable que cumplen una condición con subset, después con el subconjunto obtenido aplico aggregate para obtener subconjuntos agrupados por especies y calculo la media de las variables:

> iris %>%
+   subset(Sepal.Length > 5) %>%
+   aggregate(. ~ Species, ., mean)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa     5.313636    3.713636     1.509091   0.2772727
2 versicolor     5.997872    2.804255     4.317021   1.3468085
3  virginica     6.622449    2.983673     5.573469   2.0326531

El “.” se usa para indicar donde se usa el argumento recibido por el pipe (argument placeholder).

Paquete pipeR

El paquete pipeR introduce el operador %>>%:

rnorm(100) %>>%
  plot(col="red")

Como antes Usamos “.” para posicionar el argumento:

rnorm(100) %>>%
  plot(col="red", main=length(.))

La función Pipe crea un objeto que almacena un dato y permite concatenar comandos con $ (Object-based pipeline).

Pipe(rnorm(100))$mean()

Código fuente

Enlaces internos

Enlaces externos