O que significa%>% função em R?


119

Eu vi o uso da função %>%(por cento maior que por cento) em alguns pacotes como dplyr e rvest . O que isso significa? É uma maneira de escrever blocos de fechamento em R?


10
ou veja?'%>%'
jbaums

6
Obrigado David! jbaums, infelizmente não há nenhum doc sobre isso. ? '%>%' retorna "Sem documentação para '%>%' em pacotes e bibliotecas especificados"
alfakini

6
@alf. você precisa library(magrittr)ou library(dplyr)primeiro e depois execute ?'%>%', embora meu link forneça mais informações
David Arenburg

1
Além disso, dê uma olhada aqui
David Arenburg

Respostas:


141

% ...% operadores

%>%não tem nenhum significado embutido, mas o usuário (ou um pacote) é livre para definir os operadores do formulário %whatever%da maneira que quiser. Por exemplo, esta função retornará uma string consistindo em seu argumento esquerdo seguido por uma vírgula e espaço e então seu argumento direito.

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

# test run

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

A base de R fornece %*%(multiplicação de matriz), %/%(divisão inteira), %in%(lhs é um componente do rhs?), %o%(Produto externo) e %x%(produto de kronecker). Não está claro se se %%enquadra nesta categoria ou não, mas representa o módulo.

expm O pacote R, expm, define um operador de potência de matriz %^%. Para um exemplo veja poder Matrix em R .

operadores O pacote de operadores R definiu um grande número de tais operadores, como %!in%(para não %in%). Consulte http://cran.r-project.org/web/packages/operators/operators.pdf

Tubos

magrittr No caso do %>%pacote magrittr R o definiu conforme discutido na vinheta magrittr. Veja http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

magittr também definiu vários outros operadores desse tipo. Veja a secção Adicional Cachimbo Operadores da ligação antes que discute %T>%, %<>%e %$%e http://cran.r-project.org/web/packages/magrittr/magrittr.pdf para ainda mais detalhes.

dplyr O pacote dplyr R usado para definir um %.%operador que é semelhante; entretanto, ele se tornou obsoleto e o dplyr agora recomenda que os usuários usem o %>%que dplyr importa do magrittr e o torna disponível para o usuário dplyr. Como David Arenburg mencionou nos comentários, esta questão do SO discute as diferenças entre ela e a de magrittr %>%: Diferenças entre%.% (Dplyr) e%>% (magrittr)

pipeR O pacote R, pipeR, define um %>>%operador semelhante ao%>% de magrittr e pode ser usado como uma alternativa a ele. Veja http://renkun.me/pipeR-tutorial/

O pacote pipeR também definiu vários outros operadores desse tipo. Veja: http://cran.r-project.org/web/packages/pipeR/pipeR.pdf

postlogic O pacote postlogic definido %if%e %unless%operadores.

wrapr O pacote R, wrapr, define um dot pipe %.>%que é uma versão explícita %>%, pois não faz a inserção implícita de argumentos, mas apenas substitui os usos explícitos de ponto no lado direito. Isso pode ser considerado como outra alternativa para %>%. Veja https://winvector.github.io/wrapr/articles/dot_pipe.html

Tubo bizarro . Este não é realmente um pipe, mas uma sintaxe base inteligente para funcionar de maneira semelhante aos pipes, sem realmente usar pipes. É discutido em http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/ A ideia é que, em vez de escrever:

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

um escreve o seguinte. Nesse caso, usamos explicitamente o ponto em vez de eliminar o argumento do ponto e finalizar cada componente do pipeline com uma atribuição à variável cujo nome é ponto ( .). Seguimos isso com um ponto e vírgula.

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

Atualização Adicionada informação sobre o pacote expm e exemplo simplificado no topo. Adicionado pacote postlogic.


1
Também vejo:% <>%,% T>%,% $%, o que eles fazem? rpackages.ianhowson.com/cran/magrittr/man/pipe.html
pluke de

De dentro de R, após carregar magrittr, obtenha ajuda usando:, ?"%<>%"etc.
G. Grothendieck

17

Meu entendimento depois de ler o link oferecido por G.Grothendieck é que%>% é um operador que canaliza funções. Isso ajuda na legibilidade e na produtividade, pois é mais fácil seguir o fluxo de várias funções por meio desses tubos do que voltar quando várias funções estão aninhadas.


As vantagens que você mencionou são demonstradas com exemplos de código aqui .
Christopher Stephan

9

%>%é semelhante ao pipe no Unix. Por exemplo, em

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

a saída de combined_data_setirá para group_bye sua saída irá para tally, então a saída final é atribuída a a.

Isso fornece uma maneira prática e fácil de usar funções em série sem criar variáveis ​​e armazenar valores intermediários.


-1

Os pacotes R dplyr e sf importam o operador%>% do pacote R magrittr.

A ajuda está disponível usando o seguinte comando:

?'%>%'

Claro que o pacote deve ser carregado antes de usar, por exemplo,

library(sf)

A documentação do operador magrittr forward-pipe dá um bom exemplo: Quando as funções requerem apenas um argumento, x%>% f é equivalente af (x)


1
Parece que isso já está bem explicado em stackoverflow.com/a/27129032/570918 .
merv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.