Co oznacza funkcja%>% w R?

120

Widziałem użycie funkcji %>%(procent większy niż procent) w niektórych pakietach, takich jak dplyr i rvest . Co to znaczy? Czy jest to sposób na pisanie bloków zamykających w R?

alfakini
źródło
10
lub spójrz na?'%>%'
jbaums,
6
Dzięki David! jbaums, niestety nie ma na ten temat żadnego dokumentu. ? '%>%' retuns "Brak dokumentacji dla '%>%' w określonych pakietach i bibliotekach"
alfakini
6
@alf. musisz library(magrittr)lub library(dplyr)najpierw, a następnie uruchom ?'%>%', chociaż mój link dostarcza więcej informacji
David Arenburg
1
Spójrz także tutaj
David Arenburg,
1
Powiązane: Co oznacza%>% w R
Joshua Ulrich

Odpowiedzi:

142

% ...% operatorów

%>%nie ma wbudowanego znaczenia, ale użytkownik (lub pakiet) może swobodnie definiować operatory formularza %whatever%w dowolny sposób. Na przykład ta funkcja zwróci ciąg składający się z lewego argumentu, po którym następuje przecinek i spacja, a następnie jest to prawy argument.

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

# test run

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

Podstawa R zapewnia %*%(mnożenie macierzy), %/%(dzielenie całkowite), %in%( %o%czy %x%lhs jest składową prawej strony?), (Iloczyn zewnętrzny) i (iloczyn Kroneckera). Nie jest jasne, czy %%należy do tej kategorii, czy nie, ale reprezentuje modulo.

expm Pakiet R, expm, definiuje operator potęgi macierzy %^%. Na przykład patrz moc matrycy w R .

operatorzy W pakiecie operatorów R zdefiniowano dużą liczbę takich operatorów, takich jak %!in%(dla nie %in%). Zobacz http://cran.r-project.org/web/packages/operators/operators.pdf

Rury

magrittr W przypadku %>%magrittr pakiet R zdefiniował go tak, jak zostało to omówione w winiecie magrittr. Zobacz http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

magittr zdefiniował również szereg innych takich operatorów. Zobacz sekcję rury operatorzy uprzedniej linku który omawia %T>%, %<>%a %$%i http://cran.r-project.org/web/packages/magrittr/magrittr.pdf jeszcze więcej szczegółów.

dplyr Pakiet dplyr R używany do definiowania %.%operatora, który jest podobny; jednak został on przestarzały i dplyr zaleca teraz, aby użytkownicy używali tego, %>%który dplyr importuje z magrittr i udostępnia użytkownikowi dplyr. Jak wspomniał David Arenburg w komentarzach, to pytanie SO omawia różnice między nim a magrittr's %>%: Różnice między%.% (Dplyr) a%>% (magrittr)

pipeR Pakiet R, pipeR, definiuje %>>%operator podobny do%>% magrittr i może być używany jako alternatywa dla niego. Zobacz http://renkun.me/pipeR-tutorial/

Pakiet pipeR również zdefiniował szereg innych takich operatorów. Zobacz: http://cran.r-project.org/web/packages/pipeR/pipeR.pdf

postlogic Zdefiniowany pakiet postlogiczny %if%i %unless%operatory.

wrapr Pakiet R, wrapr, definiuje potok kropkowy, %.>%który jest jawną wersją programu %>%, ponieważ nie wstawia niejawnie argumentów, a jedynie zastępuje jawne użycie kropki po prawej stronie. Można to uznać za inną alternatywę dla %>%. Zobacz https://winvector.github.io/wrapr/articles/dot_pipe.html

Fajka Bizarro . To nie jest tak naprawdę potok, ale raczej sprytna podstawowa składnia działająca w sposób podobny do potoków bez faktycznego używania potoków. Jest to omówione na http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/ Chodzi o to, aby zamiast pisać:

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

jeden pisze co następuje. W tym przypadku jawnie używamy kropki zamiast wymazywać argument kropkowy i kończymy każdy składnik potoku przypisaniem do zmiennej, której nazwa to dot ( .). Po tym wpisujemy średnik.

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

Aktualizacja Dodano informacje o pakiecie expm i uproszczony przykład u góry. Dodano pakiet postlogiczny.

G. Grothendieck
źródło
1
Widzę też:% <>%,% T>%,% $%, co oni robią? rpackages.ianhowson.com/cran/magrittr/man/pipe.html
pluke
Z poziomu R po załadowaniu magrittr uzyskaj pomoc przy użyciu:, ?"%<>%"itp.
G. Grothendieck
17

Po przeczytaniu linku zaoferowanego przez G.Grothendiecka zrozumiałem, że%>% jest operatorem, który potokuje funkcje. Zwiększa to czytelność i produktywność, ponieważ łatwiej jest śledzić przepływ wielu funkcji przez te rury niż cofać się, gdy wiele funkcji jest zagnieżdżonych.

Francisco López-Sancho
źródło
Zalety, które wymieniłeś są przedstawione przykłady kodu tutaj .
Christopher Stephan
9

%>%jest podobny do potoku w systemie Unix. Na przykład w

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

wyjście combined_data_setprzejdzie do, group_bya wyjście przejdzie do tally, a następnie przypisane jest wyjście końcowe a.

Daje to wygodny i łatwy sposób korzystania z funkcji w serii bez tworzenia zmiennych i przechowywania wartości pośrednich.

RAJAT BHATHEJA
źródło
-1

Pakiety R dplyr i sf importują operator%>% z pakietu R magrittr.

Pomoc jest dostępna za pomocą następującego polecenia:

?'%>%'

Oczywiście paczka musi zostać wcześniej załadowana za pomocą np

library(sf)

Dokumentacja operatora potoku do przodu magrittr podaje dobry przykład: Gdy funkcje wymagają tylko jednego argumentu, x%>% f jest równoważne f (x)

HKE
źródło
1
Wygląda na to, że jest to już dobrze wyjaśnione na stackoverflow.com/a/27129032/570918 .
merv