2015-12-03 4 views
5

Ich kann das nicht herausfinden.Oddity mit dplyr und alle

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 

Ich finde es verwirrend, dass all(.$b) funktioniert nicht. Das scheint mir überhaupt nicht intuitiv zu sein.

Antwort

6

Nun, der %>% Operator wird von dem magrittr Paket lieh die die definiert following rules:

  1. Standardmäßig wird die linke Seite (LHS) wird als erstes Argument der Funktion an der frei geleitet werden rechte Seite (RHS).
  2. Wenn die LHS an einer anderen Position als der ersten benötigt wird, kann der Punkt "." Als Platzhalter verwendet werden.

Sie, dass der gesamte Datenrahmen noch als erste Parameter mit diesem Beispiel

übergeben wird, ist sehen
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 

So sowohl die data.frame und der Vektor Sie bekommen (die Funktion Empfang zwei Parameter). Ich glaube, dies liegt daran, dass Sie die . nicht an eine andere Position als den ersten Parameter verschieben, so dass Sie das Verhalten nicht ändern, um das Objekt als ersten Parameter weiterzuleiten.

Es passiert einfach, dass das magrittr Paket einen anderen Operator für den Einsatz in Fällen wie diesem hat. Sie können %$% verwenden.

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

Große Antwort. Ich hatte den Eindruck, dass, wenn Sie explizit '.' Eingeben, es nicht '. Offensichtlich war ich falsch. –