¿Qué significa la función%>% en R?

119

He visto el uso de la función %>%(porcentaje mayor que porcentaje) en algunos paquetes como dplyr y rvest . Qué significa eso? ¿Es una forma de escribir bloques de cierre en R?

alfakini
fuente
10
o mira?'%>%'
jbaums
6
¡Gracias David! jbaums, desafortunadamente no hay ningún documento sobre esto. ? '%>%' devuelve "No hay documentación para '%>%' en paquetes y bibliotecas especificados"
alfakini
6
@alf. necesita library(magrittr)o library(dplyr)primero y luego ejecutar ?'%>%', aunque mi enlace proporciona más información
David Arenburg
1
Además, eche un vistazo aquí
David Arenburg
1
Relacionado: ¿Qué significa%>% en R
Joshua Ulrich

Respuestas:

141

% ...% operadores

%>%no tiene un significado incorporado, pero el usuario (o un paquete) es libre de definir los operadores del formulario de la forma que %whatever%desee. 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 matriz), %/%(división de números enteros), %in%(¿es lhs un componente del rhs?), %o%(Producto externo) y %x%(producto de kronecker). No está claro si %%cae en esta categoría o no, pero representa módulo.

expm El paquete R, expm, define un operador de potencia matricial %^%. Véase un ejemplo en el poder de la matriz en I .

operadores El paquete R de operadores ha definido un gran número de operadores tales como %!in%(for not %in%). Ver http://cran.r-project.org/web/packages/operators/operators.pdf

Tubería

magrittr En el caso del %>%paquete magrittr R lo ha definido como se discutió en la viñeta magrittr. Ver http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

magittr también ha definido una serie de otros operadores similares. Ver la sección adicional Operadores Pipe del enlace anterior, que analiza %T>%, %<>%y %$%y http://cran.r-project.org/web/packages/magrittr/magrittr.pdf incluso para más detalles.

dplyr El paquete dplyr R utilizado para definir un %.%operador que es similar; sin embargo, ha quedado obsoleto y ahora dplyr recomienda que los usuarios utilicen el %>%que dplyr importa de magrittr y lo pone a disposición del usuario de dplyr. Como ha mencionado David Arenburg en los comentarios, esta pregunta SO discute las diferencias entre ella y la de magrittr %>%: Diferencias entre%.% (Dplyr) y%>% (magrittr)

pipeR El paquete R, pipeR, define un %>>%operador que es similar al%>% de magrittr y se puede usar como una alternativa. 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 un dot pipe %.>%que es una versión explícita de %>%en el sentido de que no hace una inserción implícita de argumentos, sino que solo sustituye los usos explícitos de dot en el lado derecho. Esto puede considerarse como otra alternativa a %>%. Ver https://winvector.github.io/wrapr/articles/dot_pipe.html

Pipa bizarro . Esto no es realmente una tubería, sino más bien una sintaxis básica inteligente para trabajar de una manera similar a las tuberías sin usar realmente las tuberías. Se discute 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 de punto y terminamos 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 Información agregada sobre el paquete expm y ejemplo simplificado en la parte superior. Paquete postlogic agregado.

G. Grothendieck
fuente
1
También veo:% <>%,% T>%,% $%, ¿qué hacen? rpackages.ianhowson.com/cran/magrittr/man/pipe.html
pluke
Desde dentro de R después de cargar magrittr, obtenga ayuda para usar:, ?"%<>%"etc.
G. Grothendieck
17

Mi entendimiento después de leer el enlace ofrecido por G.Grothendieck es que%>% 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 se anidan múltiples funciones.

Francisco López-Sancho
fuente
Las ventajas que mencionó se demuestran con ejemplos de código aquí .
Christopher Stephan
9

%>%es similar a pipe en Unix. Por ejemplo, en

a <- combined_data_set %>% group_by(Outlet_Identifier) %>% tally()

la salida de combined_data_setentrará group_byy su salida entrará tally, luego se asignará la salida final a a.

Esto le brinda una forma práctica y fácil de usar funciones en serie sin crear variables ni almacenar valores intermedios.

RAJAT BHATHEJA
fuente
-1

Los paquetes R dplyr y sf importan el operador%>% del paquete R magrittr.

Hay ayuda disponible mediante el siguiente comando:

?'%>%'

Por supuesto, el paquete debe cargarse antes utilizando, por ejemplo,

library(sf)

La documentación del operador magrittr forward-pipe da un buen ejemplo: cuando las funciones requieren solo un argumento, x%>% f es equivalente af (x)

HKE
fuente
1
Parece que esto ya está bien explicado en stackoverflow.com/a/27129032/570918 .
merv