2015-12-03 8 views
5

मैं इसे समझ नहीं सकता।dplyr के साथ विषमता और सभी

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 

मुझे यह भ्रमित लगता है कि all(.$b) काम नहीं करता है। यह मेरे लिए सहज नहीं लगता है।

उत्तर

6

खैर, %>% ऑपरेटर magrittr पैकेज है जो परिभाषित करता है से लिया गया है following rules:

  1. डिफ़ॉल्ट रूप से बाएं हाथ की ओर (एलएचएस) समारोह का पहला तर्क पर प्रदर्शित होने के रूप में में पहुंचाया हो जाएगा दाएं हाथ की ओर (आरएचएस)।
  2. जब पहले के अलावा किसी अन्य स्थिति में एलएचएस की आवश्यकता होती है, तो कोई भी प्लेसहोल्डर के रूप में डॉट, '।' का उपयोग कर सकता है।

आप देख सकते हैं कि पूरे डेटा फ्रेम अभी भी इस उदाहरण

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 

तो तुम दोनों data.frame और वेक्टर हो रही है साथ पहले पैरामीटर के रूप में पारित किया जा रहा है (समारोह प्राप्त कर रहा है दो पैरामीटर)। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि आप . को पहले पैरामीटर के अलावा किसी अन्य स्थिति में नहीं ले जा रहे हैं, इसलिए आप ऑब्जेक्ट के साथ पहले पैरामीटर के रूप में पास करने के लिए व्यवहार को नहीं बदल रहे हैं।

ऐसा इसलिए होता है कि magrittr पैकेज के इस तरह के मामलों में उपयोग के लिए एक अलग ऑपरेटर है। आप %$% का उपयोग कर सकते हैं।

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

ग्रेट उत्तर। मैं इस धारणा के तहत था कि जब आप स्पष्ट रूप से '.' टाइप करते हैं, तो यह फिर से आगे नहीं बढ़ता है। स्पष्ट रूप से मैं गलत था। –

संबंधित मुद्दे