2014-12-08 30 views
14

Tôi muốn hiểu tại sao, trong gói dplyr hoặc magrittr, và cụ thể hơn chức năng chaining %>% có một số rắc rối với các nhà khai thác cơ bản +, -, *, và /khai thác chuỗi số học trong dplyr với%>% ống

Chaining mất đầu ra của tuyên bố trước đó và ăn nó như là đối số đầu tiên của tiếp theo:

1:10 %>% sum 
# [55] 

như vậy làm thế nào mà điều này không làm việc

1:10 %>% *2 %>% sum 
1:10 %>% .*2 %>% sum 

Tôi cũng thấy rằng cú pháp sau hoạt động để thêm/trừ, nhưng không nhân hoặc chia. tại sao như vậy?

1:10 %>% +(2) # works OK 
1:10 %>% *(2) # nope... 

Vì vậy, tôi nên viết chức năng ẩn danh ngay cả khi thực hiện thao tác *2 trên data.frame của tôi?

1:10 %>% (function(x) x*2) %>% sum 

Cảm ơn, tôi không thể tìm thấy câu trả lời trong SO câu hỏi khác.

+5

Bạn muốn sử dụng gói 'magrittr' ở đây thay vì dplyr. dplyr chỉ để làm việc với data.frames trong khi toán tử đường ống ('%>%') ban đầu là từ magrittr. –

+2

Chỉ cần thêm chúng bình thường? – stanekam

+3

Giải thích về hành vi này: cộng và trừ chỉ hoạt động ở đây vì trình phân tích cú pháp xem chúng là toán tử cộng và trừ đơn nhất, như trong '-2'. Cú pháp hợp lệ của nó. Vì vậy, nó phân tích không sao ở đây, và sau đó magrittr được làm việc mangling đánh giá vào một biểu thức nhị phân '" - "(x, 2)'. Không có chức năng '*' hoặc '/' đơn nhất nào, vì vậy các op đó thất bại. Khi được trích dẫn, chúng trở thành cú pháp hợp lệ một lần nữa và chức năng tương ứng được nhận. – Spacedman

Trả lời

24

Surround các nhà khai thác với backticks hoặc dấu ngoặc kép, và những điều nên làm việc như mong đợi:

1:10 %>% `*`(2) %>% sum 
# [1] 110 

1:10 %>% `/`(2) %>% sum 
# [1] 27.5 
+7

Tốt hơn để sử dụng backticks để báo giá, bởi vì nó phân biệt rõ ràng hơn giữa các tên hàm và chuỗi không phải cú pháp. (Thực tế là các tác phẩm '" + "(1, 3)', theo ý kiến ​​của tôi, một vật phẩm lịch sử. – hadley

18

Hoặc sử dụng Aliases trong magrittr gói, ví dụ:

1:10 %>% multiply_by(2) 
# [1] 2 4 6 8 10 12 14 16 18 20 

1:10 %>% add(2) 
# [1] 3 4 5 6 7 8 9 10 11 12 

Các Aliases bao gồm 'từ' cho toán tử boolean, trích xuất/thay thế và toán tử số học