Usando pipes

El objetivo de un pipe es ayudarte a escribir código de una manera que sea más fácil de leer y entender.

Antes de programar, veamos un ejemplo de motivación:

El pequeño conejito Foo Foo
Fue saltando por el bosque
Recogiendo ratones del campo
Y golpeándolos en la cabeza.

Podemos empezar por declarar un objeto que represente a nuestro protagonista:

foo_foo <- pequeño_conejito()

Usando este objeto y verbos para cada acción (por ejemplo saltar), podemos contar la misma historia en las siguientes formas:

  1. Guardar cada paso intermedio como un nuevo objeto.
  2. Sobreescribir el objeto original muchas veces.
  3. Componer funciones.
  4. Usar un pipe.

1. Pasos intermedios

foo_foo_1 <- saltar(foo_foo, a_traves = bosque)
foo_foo_2 <- recoger(foo_foo_1, que = ratones_del_campo)
foo_foo_3 <- golpear(foo_foo_2, en = cabeza)

2. Sobrescribir el original

foo_foo <- saltar(foo_foo, a_traves = bosque)
foo_foo <- recoger(foo_foo, que = ratones_del_campo)
foo_foo <- golpear(foo_foo, en = cabeza)

3. Composición de funciones

golpear(
  recoger(
    saltar(foo_foo, por_el = bosque),
    que = raton_de_campo
  ),
  en = la_cabeza
)

4. Usando el pipe

foo_foo %>%
  saltar(a_través = bosque) %>%
  recoger(que = ratones_campo) %>%
  golpear(en = cabeza)

Internamente, magrittr transforma el código anterior en:

mi_pipe <- function(.) {
  . <- saltar(., a_traves = bosque)
  . <- recoger(., que = ratones_campo)
  golpear(., en = la_cabeza)
}
mi_pipe(foo_foo)

Otras herramientas de magrittr

1. Devolver los contenidos de la izquierda, %T>%
set.seed(2021)
rnorm(100) %>%
  matrix(ncol = 2) %>%
  plot() %>%
  str()

##  NULL
set.seed(2021)
rnorm(100) %>%
  matrix(ncol = 2) %T>%
  plot() %>%
  str()

##  num [1:50, 1:2] -0.122 0.552 0.349 0.36 0.898 ...
2. Trabajar con funciones que no tienen una API basada en data frames, %$%
mtautos %$%
  cor(cilindrada, millas)
## [1] -0.8475514
3. Para asignaciones, %<>%
mtautos <- mtautos %>%
  transform(cilindros = cilindros * 2)
mtautos %<>% transform(cilindros = cilindros * 2)
4. Para cambiar nombres de columnas
mtautos %>%
  magrittr::set_names(c("millas_por_galon", colnames(.)[-1]))
##                     millas_por_galon cilindros cilindrada caballos  eje  peso
## Mazda RX4                       21.0        24      160.0      110 3.90 2.620
## Mazda RX4 Wag                   21.0        24      160.0      110 3.90 2.875
## Datsun 710                      22.8        16      108.0       93 3.85 2.320
## Hornet 4 Drive                  21.4        24      258.0      110 3.08 3.215
## Hornet Sportabout               18.7        32      360.0      175 3.15 3.440
## Valiant                         18.1        24      225.0      105 2.76 3.460
## Duster 360                      14.3        32      360.0      245 3.21 3.570
## Merc 240D                       24.4        16      146.7       62 3.69 3.190
## Merc 230                        22.8        16      140.8       95 3.92 3.150
## Merc 280                        19.2        24      167.6      123 3.92 3.440
## Merc 280C                       17.8        24      167.6      123 3.92 3.440
## Merc 450SE                      16.4        32      275.8      180 3.07 4.070
## Merc 450SL                      17.3        32      275.8      180 3.07 3.730
## Merc 450SLC                     15.2        32      275.8      180 3.07 3.780
## Cadillac Fleetwood              10.4        32      472.0      205 2.93 5.250
## Lincoln Continental             10.4        32      460.0      215 3.00 5.424
## Chrysler Imperial               14.7        32      440.0      230 3.23 5.345
## Fiat 128                        32.4        16       78.7       66 4.08 2.200
## Honda Civic                     30.4        16       75.7       52 4.93 1.615
## Toyota Corolla                  33.9        16       71.1       65 4.22 1.835
## Toyota Corona                   21.5        16      120.1       97 3.70 2.465
## Dodge Challenger                15.5        32      318.0      150 2.76 3.520
## AMC Javelin                     15.2        32      304.0      150 3.15 3.435
## Camaro Z28                      13.3        32      350.0      245 3.73 3.840
## Pontiac Firebird                19.2        32      400.0      175 3.08 3.845
## Fiat X1-9                       27.3        16       79.0       66 4.08 1.935
## Porsche 914-2                   26.0        16      120.3       91 4.43 2.140
## Lotus Europa                    30.4        16       95.1      113 3.77 1.513
## Ford Pantera L                  15.8        32      351.0      264 4.22 3.170
## Ferrari Dino                    19.7        24      145.0      175 3.62 2.770
## Maserati Bora                   15.0        32      301.0      335 3.54 3.570
## Volvo 142E                      21.4        16      121.0      109 4.11 2.780
##                     velocidad forma transmision cambios carburadores
## Mazda RX4               16.46     0           1       4            4
## Mazda RX4 Wag           17.02     0           1       4            4
## Datsun 710              18.61     1           1       4            1
## Hornet 4 Drive          19.44     1           0       3            1
## Hornet Sportabout       17.02     0           0       3            2
## Valiant                 20.22     1           0       3            1
## Duster 360              15.84     0           0       3            4
## Merc 240D               20.00     1           0       4            2
## Merc 230                22.90     1           0       4            2
## Merc 280                18.30     1           0       4            4
## Merc 280C               18.90     1           0       4            4
## Merc 450SE              17.40     0           0       3            3
## Merc 450SL              17.60     0           0       3            3
## Merc 450SLC             18.00     0           0       3            3
## Cadillac Fleetwood      17.98     0           0       3            4
## Lincoln Continental     17.82     0           0       3            4
## Chrysler Imperial       17.42     0           0       3            4
## Fiat 128                19.47     1           1       4            1
## Honda Civic             18.52     1           1       4            2
## Toyota Corolla          19.90     1           1       4            1
## Toyota Corona           20.01     1           0       3            1
## Dodge Challenger        16.87     0           0       3            2
## AMC Javelin             17.30     0           0       3            2
## Camaro Z28              15.41     0           0       3            4
## Pontiac Firebird        17.05     0           0       3            2
## Fiat X1-9               18.90     1           1       4            1
## Porsche 914-2           16.70     0           1       5            2
## Lotus Europa            16.90     1           1       5            2
## Ford Pantera L          14.50     0           1       5            4
## Ferrari Dino            15.50     0           1       5            6
## Maserati Bora           14.60     0           1       5            8
## Volvo 142E              18.60     1           1       4            2
5. Para cambiar la clase de un objeto
class(mtautos)
## [1] "data.frame"
mtautos %>%
  magrittr::set_class(c("autos", class(.))) %>%
  class()
## [1] "autos"      "data.frame"