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:
<- pequeño_conejito() foo_foo
Usando este objeto y verbos para cada acción (por ejemplo saltar), podemos contar la misma historia en las siguientes formas:
- Guardar cada paso intermedio como un nuevo objeto.
- Sobreescribir el objeto original muchas veces.
- Componer funciones.
- Usar un pipe.
1. Pasos intermedios
<- saltar(foo_foo, a_traves = bosque)
foo_foo_1 <- recoger(foo_foo_1, que = ratones_del_campo)
foo_foo_2 <- golpear(foo_foo_2, en = cabeza) foo_foo_3
2. Sobrescribir el original
<- saltar(foo_foo, a_traves = bosque)
foo_foo <- recoger(foo_foo, que = ratones_del_campo)
foo_foo <- golpear(foo_foo, en = cabeza) foo_foo
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:
<- function(.) {
mi_pipe <- 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)
%<>% transform(cilindros = cilindros * 2) mtautos
4. Para cambiar nombres de columnas
%>%
mtautos ::set_names(c("millas_por_galon", colnames(.)[-1])) magrittr
## 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