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

Resuelto alfakini asked hace 54 años • 7 respuestas

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?

alfakini avatar Jan 01 '70 08:01 alfakini
Aceptado

%...% 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
G. Grothendieck avatar Nov 25 '2014 14:11 G. Grothendieck

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

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

la salida de combined_data_setirá a group_byy 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.

RAJAT BHATHEJA avatar Mar 21 '2018 06:03 RAJAT BHATHEJA

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.

Francisco López-Sancho avatar Oct 14 '2016 22:10 Francisco López-Sancho