web-dev-qa-db-fra.com

Que signifie%>% fonction dans R?

J'ai vu l'utilisation de la fonction %>% (pourcentage supérieur à%) dans certains packages tels que dplyr et rvest. Qu'est-ce que ça veut dire? Est-ce une façon d'écrire des blocs de fermeture en R?

63
alfakini

%...% les opérateurs

%>% n'a pas de signification intrinsèque, mais l'utilisateur (ou un package) est libre de définir les opérateurs de la forme %whatever% comme bon leur semble. Par exemple, cette fonction renverra une chaîne composée de son argument de gauche suivi d'une virgule et d'un espace, puis de son argument de droite.

"%,%" <- function(x, y) paste0(x, ", ", y)

# test run

"Hello" %,% "World"
## [1] "Hello, World"

La base de R fournit %*% (multiplication de matrice), %/% (division entière), %in% (est-ce que lhs est un composant du rhs?), %o% (produit externe) et %x% (produit kronecker). Il n’est pas clair si %% tombe dans cette catégorie ou non, mais cela représente modulo.

expm Le package R, expm, définit un opérateur de puissance de matrice %^%. Pour un exemple, voir Puissance de la matrice dans R .

opérateurs Le package d'opérateurs R a défini un grand nombre d'opérateurs tels que %!in% (pour ne pas %in%). Voir http://cran.r-project.org/web/packages/operators/operators.pdf

Les pipes

magrittr Dans le cas de %>%, le package magrittr R l'a défini comme indiqué dans la vignette magrittr. Voir http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

magittr a également défini un certain nombre d'autres opérateurs de ce type. Voir la section Autres opérateurs de canalisations du lien précédent, qui traite de %T>%, %<>% et %$% et http://cran.r-project.org/web/packages/magrittr/magrittr.pdf pour plus de détails.

dplyr Le package dplyr R utilisé pour définir un opérateur %.% qui est similaire; cependant, il est obsolète et dplyr recommande désormais aux utilisateurs d’utiliser %>% qui dplyr importe depuis magrittr et est mis à la disposition de cet utilisateur. Comme David Arenburg l'a mentionné dans les commentaires, cette question SO traite des différences entre celle-ci et le %>% de magrittr: Différences entre%.% (Dplyr) et%>% (magrittr)

pipeR Le package R, pipeR, définit un opérateur %>>% similaire au%>% de magrittr et pouvant être utilisé à la place de celui-ci. Voir http://renkun.me/pipeR-tutorial/

Le paquet pipeR a également défini un certain nombre d’opérateurs similaires. Voir: http://cran.r-project.org/web/packages/pipeR/pipeR.pdf

postlogic Le paquet postlogic a défini les opérateurs %if% et %unless%.

wrapr Le package R, wrapr, définit un point code %.>% qui est une version explicite de %>%, dans la mesure où il ne fait pas d'insertion implicite d'arguments mais se substitue uniquement aux utilisations explicites de point du côté droit. Ceci peut être considéré comme une autre alternative à %>%. Voir https://winvector.github.io/wrapr/articles/dot_pipe.html

Pipe Bizarro. Ce n'est pas vraiment un tuyau, mais plutôt une syntaxe de base intelligente pour travailler de manière similaire aux tuyaux sans utiliser réellement de tuyaux. Il est discuté dans http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r- L'idée est que au lieu d'écrire:

1:8 %>% sum %>% sqrt
## [1] 6

on écrit ce qui suit. Dans ce cas, nous utilisons explicitement point plutôt que d'éliminer l'argument point et nous finissons chaque composant du pipeline par une affectation à la variable dont le nom est point (.). Nous suivons cela avec un point-virgule.

1:8 ->.; sum(.) ->.; sqrt(.)
## [1] 6

Update Ajout d'informations sur le paquet expm et exemple simplifié en haut. Ajout du paquet postlogic.

103
G. Grothendieck

D'après ce que j'ai compris après avoir lu le lien proposé par G.Grothendieck est que%>% est un opérateur qui conduit les fonctions pour améliorer la lisibilité et la productivité, car il est plus facile de suivre le flux de fonctions multiples à travers ces tuyaux que de revenir en arrière lorsque plusieurs fonctions sont imbriquées.

10

%>% est similaire à pipe sous Unix. Par exemple, dans

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

la sortie de combined_data_set ira dans group_by et sa sortie dans tally, la sortie finale sera affectée à a.

Vous disposez ainsi d’un moyen pratique et simple d’utiliser les fonctions en série sans créer de variables ni stocker de valeurs intermédiaires. 

5
RAJAT BHATHEJA

Le tube %>% passe la sortie du cadre de données résultant de la fonction située juste avant le canal pour le saisir comme premier argument de la fonction juste après le canal.

For Example

0
Jordan