¿Qué significa la función %>% en R?
He visto el uso de %>%
la función (porcentaje mayor que porcentaje) en algunos paquetes como dplyr y rvest . ¿Qué significa? ¿Es una forma de escribir bloques de cierre en R?
%...% operadores
%>%
no tiene ningún significado incorporado, pero el usuario (o un paquete) es libre de definir los operadores del formulario %whatever%
como quiera. Por ejemplo, esta función devolverá una cadena que consta de su argumento izquierdo seguido de una coma y un espacio y luego su argumento derecho.
"%,%" <- function(x, y) paste0(x, ", ", y)
# test run
"Hello" %,% "World"
## [1] "Hello, World"
La base de R proporciona %*%
(multiplicación de matrices), %/%
(división de enteros), %in%
(¿es lhs un componente de rhs?), %o%
(producto externo) y %x%
(producto de Kronecker). No está claro si %%
entra en esta categoría o no, pero representa el módulo.
expm El paquete R, expm, define un operador de potencia matricial %^%
. Para ver un ejemplo , consulte Potencia de matriz en R.
operadores El paquete de operadores R ha definido una gran cantidad de operadores como %!in%
(for not %in%
). Ver http://cran.r-project.org/web/packages/operators/operators.pdf
igraph Este paquete define %--% , %->% y %<-% para seleccionar bordes.
lubridate Este paquete define %m+% y %m-% para sumar y restar meses y %--% para definir un intervalo. igraph también define %--% .
Tubería
magrittr En el caso del %>%
paquete magrittr R lo hemos definido como se comenta en la viñeta magrittr. Ver http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html
magittr también ha definido otros operadores similares. Consulte la sección Operadores de tuberías adicionales del enlace anterior que analiza %T>%
y %<>%
http://cran.r-project.org/web/packages/magrittr/magrittr.pdf para obtener aún más detalles.%$%
dplyr El paquete dplyr R utilizado para definir un %.%
operador que es similar; sin embargo, ha quedado obsoleto y dplyr ahora recomienda que los usuarios utilicen %>%
el cual dplyr importa desde magrittr y lo pone a disposición del usuario de dplyr. Como David Arenburg ha mencionado en los comentarios, esta pregunta SO analiza las diferencias entre esta y la de magrittr %>%
: Diferencias entre %.% (dplyr) y %>% (magrittr)
pipeR El paquete R, pipeR, define un %>>%
operador que es similar al %>% de magrittr y puede usarse como alternativa a él. Ver http://renkun.me/pipeR-tutorial/
El paquete pipeR también ha definido otros operadores similares. Ver: http://cran.r-project.org/web/packages/pipeR/pipeR.pdf
postlogic El paquete postlogic definido %if%
y %unless%
operadores.
wrapr El paquete R, wrapr, define una canalización de puntos %.>%
que es una versión explícita de %>%
porque no realiza inserción implícita de argumentos sino que sólo sustituye usos explícitos de punto en el lado derecho. Esto puede considerarse como otra alternativa a %>%
. Consulte https://winvector.github.io/wrapr/articles/dot_pipe.html
Pipa extraña . Esto no es realmente una tubería, sino más bien una sintaxis base inteligente para funcionar de manera similar a las tuberías sin usar tuberías. Se comenta en http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/ La idea es que en lugar de escribir:
1:8 %>% sum %>% sqrt
## [1] 6
uno escribe lo siguiente. En este caso usamos explícitamente punto en lugar de elidir el argumento punto y finalizamos cada componente de la canalización con una asignación a la variable cuyo nombre es punto( .
). Seguimos eso con un punto y coma.
1:8 ->.; sum(.) ->.; sqrt(.)
## [1] 6
Actualización Se agregó información sobre el paquete expm y un ejemplo simplificado en la parte superior. Paquete postlógico agregado.
Actualización 2 La versión de desarrollo de R ha definido una |>
tubería. A diferencia del de magrittr, %>%
solo puede sustituirse en el primer argumento del lado derecho. Aunque limitado, funciona mediante transformación de sintaxis, por lo que no afecta al rendimiento.
Actualización 3 En versiones recientes de R, se puede usar el guión bajo _ en el lado derecho para especificar un argumento diferente al primero. I
"banana" |> grepl("an", x = _)
Solo se puede usar una vez, no se puede usar para una llamada dentro de una llamada y se debe nombrar el argumento _.
# Specify name.
"banana" |> grepl("an", _) # bad
"banana" |> grepl("an", x = _) # ok
# Must be an argument to grepl, not sub. Break into two.
"banana" |> grepl("an", x = sub("n", "m", x = _)) # bad
"banana" |> sub("n", "m", x = _) |> grepl("an", x = _) # ok
# Can only be used once on RHS.
"banana" |> grepl(pattern = _, x _) # bad
"banana" |> list(. = _) |> with(grepl(pattern = ., .)) # ok
%>%
es similar a pipe en Unix. Por ejemplo, en
a <- combined_data_set %>% group_by(Outlet_Identifier) %>% tally()
la salida de combined_data_set
irá a group_by
y su salida irá a tally
, luego se asigna la salida final a a
.
Esto le brinda una forma práctica y sencilla de utilizar funciones en serie sin crear variables ni almacenar valores intermedios.
Según tengo entendido después de leer el enlace ofrecido por G. Grothendieck, %>% es un operador que canaliza funciones. Esto ayuda a la legibilidad y la productividad, ya que es más fácil seguir el flujo de múltiples funciones a través de estas tuberías que retroceder cuando hay múltiples funciones anidadas.