Hàm%>% có nghĩa là gì trong R?


119

Tôi đã thấy việc sử dụng %>%(phần trăm lớn hơn phần trăm) trong một số gói như dplyrrvest . Nó có nghĩa là gì? Nó có phải là một cách để viết các khối đóng trong R?


10
hoặc nhìn vào?'%>%'
jbaums

6
Cảm ơn David! jbaums, tiếc là không có tài liệu về điều này. ? '%>%' Retuns "Không tài liệu cho '%>%' trong các gói và các thư viện theo quy định"
alfakini

6
@alf. bạn cần phải library(magrittr)hoặc library(dplyr)đầu tiên và sau đó chạy ?'%>%', mặc dù liên kết của tôi cung cấp informaiton hơn
David Arenburg

1
Ngoài ra, hãy xem ở đây
David Arenburg

Câu trả lời:


141

Toán tử% ...%

%>%không có nghĩa nội trang nhưng người dùng (hoặc một gói) có thể tự do xác định các toán tử của biểu mẫu %whatever%theo bất kỳ cách nào họ muốn. Ví dụ, hàm này sẽ trả về một chuỗi bao gồm đối số bên trái của nó, theo sau là dấu phẩy và dấu cách, sau đó là đối số bên phải.

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

# test run

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

Cơ sở của R cung cấp %*%(phép nhân ma trận), %/%(phép chia số nguyên), %in%(lhs có phải là thành phần của rhs không?), %o%(Sản phẩm bên ngoài) và %x%(sản phẩm kronecker). Không rõ có %%thuộc loại này hay không nhưng nó đại diện cho modulo.

expm Gói R, expm, định nghĩa toán tử lũy thừa ma trận %^%. Đối với một ví dụ thấy sức mạnh Matrix trong R .

các toán tử Các toán tử Gói R đã xác định một số lượng lớn các toán tử như vậy %!in%(cho không %in%). Xem http://cran.r-project.org/web/packages/operators/operators.pdf

Đường ống

magrittr Trong trường hợp %>%gói magrittr R đã định nghĩa nó như được thảo luận trong họa tiết magrittr. Xem http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html

magittr cũng đã định nghĩa một số toán tử khác như vậy. Xem phần ống khai thác bổ sung của liên kết trước đó thảo luận %T>%, %<>%%$%http://cran.r-project.org/web/packages/magrittr/magrittr.pdf cho dù biết thêm chi tiết.

dplyr Gói dplyr R được sử dụng để xác định một %.%toán tử tương tự; tuy nhiên, nó đã không còn được dùng nữa và dplyr hiện khuyến nghị người dùng sử dụng %>%dplyr nhập từ magrittr và cung cấp cho người dùng dplyr. Như David Arenburg đã đề cập trong phần bình luận, câu hỏi SO này thảo luận về sự khác biệt giữa nó và magrittr's %>%: Sự khác biệt giữa%.% (Dplyr) và%>% (magrittr)

pipeR Gói R, pipeR, xác định một %>>%toán tử tương tự như magrittr's%>% và có thể được sử dụng thay thế cho nó. Xem http://renkun.me/pipeR-tutorial/

Gói pipeR cũng đã xác định một số toán tử khác như vậy. Xem: http://cran.r-project.org/web/packages/pipeR/pipeR.pdf

postlogic Gói postlogic được định nghĩa %if%và các %unless%toán tử.

wrapr Gói R, wrapr, định nghĩa một dấu chấm %.>%là một phiên bản rõ ràng %>%trong đó nó không chèn ẩn các đối số mà chỉ thay thế các cách sử dụng rõ ràng của dấu chấm ở phía bên phải. Đây có thể được coi là một thay thế khác cho %>%. Xem https://winvector.github.io/wrapr/articles/dot_pipe.html

Đường ống kỳ quái . Đây không thực sự là một đường ống mà là một số cú pháp cơ sở thông minh để hoạt động theo cách tương tự như đường ống mà không thực sự sử dụng đường ống. Nó được thảo luận trong http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/ Ý tưởng là thay vì viết:

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

một người viết như sau. Trong trường hợp này, chúng tôi sử dụng dot một cách rõ ràng thay vì giải thích đối số dot và kết thúc mỗi thành phần của đường ống bằng một phép gán cho biến có tên là dot ( .). Chúng tôi làm theo điều đó với dấu chấm phẩy.

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

Cập nhật Thông tin đã thêm về gói expm và ví dụ đơn giản ở trên cùng. Đã thêm gói postlogic.


1
Tôi cũng thấy:% <>%,% T>%,% $%, họ làm gì? rpackages.ianhowson.com/cran/magrittr/man/pipe.html
pluke

Từ bên trong R sau khi tải magrittr, hãy nhận trợ giúp bằng cách sử dụng:, ?"%<>%"v.v.
G. Grothendieck

17

Sự hiểu biết của tôi sau khi đọc liên kết do G.Grothendieck cung cấp là%>% là một toán tử có chức năng của đường ống. Điều này giúp dễ đọc và năng suất vì dễ dàng theo dõi luồng của nhiều chức năng qua các đường ống này hơn là quay ngược lại khi nhiều chức năng được lồng vào nhau.


Những lợi thế bạn đã đề cập được chứng minh với các ví dụ mã ở đây .
Christopher Stephan

9

%>%tương tự như pipe trong Unix. Ví dụ, trong

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

đầu ra của combined_data_setý chí đi vào group_byvà đầu ra của nó sẽ đi vào tally, sau đó đầu ra cuối cùng được gán cho a.

Điều này mang lại cho bạn cách tiện dụng và dễ dàng để sử dụng các hàm theo chuỗi mà không cần tạo biến và lưu trữ các giá trị trung gian.


-1

Các gói R dplyr và sf nhập toán tử%>% từ gói R magrittr.

Trợ giúp có sẵn bằng cách sử dụng lệnh sau:

?'%>%'

Tất nhiên gói phải được tải trước bằng cách sử dụng ví dụ:

library(sf)

Tài liệu về toán tử chuyển tiếp magrittr đưa ra một ví dụ điển hình: Khi các hàm chỉ yêu cầu một đối số, x%>% f tương đương với f (x)


1
Có vẻ như điều này đã được giải thích rõ ràng trong stackoverflow.com/a/27129032/570918 .
merv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.