2015-12-03 17 views
5

Tôi không thể tìm ra điều này.Oddity với dplyr và tất cả

library(dplyr) 
dat <- data.frame(a = 1:5,b = rep(TRUE,5)) 

# this doesn't work 
dat %>% all(.$b) # tricky 

# this doesn't work 
dat %>% all(b) # 

# this does 
dat %>% .$b %>% all 

Tôi thấy khó hiểu rằng all(.$b) không hoạt động. Điều đó dường như không trực quan với tôi chút nào.

Trả lời

6

Vâng, các nhà điều hành %>% được vay từ gói magrittr trong đó xác định following rules:

  1. Theo mặc định, phía bên tay trái (LHS) sẽ được cấp nước tập trung tại như là đối số đầu tiên của hàm xuất hiện trên phía bên tay phải (RHS).
  2. Khi cần có LHS ở vị trí khác với vị trí đầu tiên, người ta có thể sử dụng dấu chấm, '.', Làm trình giữ chỗ.

Bạn có thể thấy rằng các khung dữ liệu toàn bộ vẫn đang được thông qua tại như các tham số đầu tiên với ví dụ này

f<-function(...) str(list(...)) 
dat %>% f(.$b) 
# $ :'data.frame':  5 obs. of 2 variables: 
# ..$ a: int [1:5] 1 2 3 4 5 
# ..$ b: logi [1:5] TRUE TRUE TRUE TRUE TRUE 
# $ : logi [1:5] TRUE TRUE TRUE TRUE TRUE 

Vì vậy, bạn đang nhận được cả hai data.frame và vector (hàm được nhận hai tham số). Tôi tin rằng điều này là bởi vì bạn không di chuyển các . đến một vị trí khác với tham số đầu tiên, do đó bạn không thay đổi hành vi để vượt qua dọc theo đối tượng như tham số đầu tiên.

Nó chỉ xảy ra khi gói magrittr có toán tử khác để sử dụng trong các trường hợp như thế này. Bạn có thể sử dụng %$%.

library(magrittr) 
dat %$% all(b) 
# [1] TRUE 
+0

Câu trả lời hay. Tôi đã ấn tượng rằng khi bạn gõ '.' nó không đẩy' .' về phía trước một lần nữa. Rõ ràng là tôi đã sai. –

Các vấn đề liên quan