2016-02-11 20 views
10

Jaka jest różnica między operatorem "+" w ggplot2 a operatorem "%>%" w magrittr?Jaka jest różnica między operatorem "+" w ggplot2 i operatorem "%>%" w magrittr?

Powiedziano mi, że są one takie same, jednak jeśli weźmiemy pod uwagę poniższy scenariusz.

library(magrittr) 
library(ggplot2) 

# 1. This works 
ggplot(data = mtcars, aes(x=wt, y = mpg)) + geom_point() 

# 2. This works 
ggplot(data = mtcars) + aes(x=wt, y = mpg) + geom_point() 

# 3. This works 
ggplot(data = mtcars) + aes(x=wt, y = mpg) %>% geom_point() 

# 4. But this doesn't 
ggplot(data = mtcars) %>% aes(x=wt, y = mpg) %>% geom_point() 
+1

Również stycznie, nie trzeba wszystkie te importu. Włączenie ich do przykładu utrudnia wykrycie interferencji bibliotek. –

+3

Zmodyfikowałem twoje pytanie, aby użyć wbudowanych danych zamiast własnych danych, aby wyeliminować nieużywane pakiety i sprawić, aby cała sprawa mogła być kopiowana/wklejana. – Gregor

Odpowiedz

13

rurowe jest bardzo różne od Ponadto ggplot2 „S. To, co robi operator rury, %>%, bierze wynik po lewej stronie i umieszcza go jako pierwszy argument funkcji po prawej stronie. Na przykład:

1:10 %>% mean() 
# [1] 5.5 

Dokładnie odpowiada mean(1:10). Rura jest bardziej przydatny do zastąpienia pomnożyć zagnieżdżone funkcje np

x = factor(2008:2012) 
x_num = as.numeric(as.character(x)) 
# could be rewritten to read from left-to-right as 
x_num = x %>% as.character() %>% as.numeric() 

ale to wszystko jest ładnie wyjaśnione na co What does %>% mean in R?, należy zapoznać się że jeszcze kilka przykładów.

Korzystając z tej wiedzy, możemy ponownie napisać przykłady rur jako funkcje zagnieżdżone i zobaczyć, że wciąż robią to samo; ale teraz to (mam nadzieję) jest oczywiste, dlaczego # 4 nie działa:

# 3. This is acceptable ggplot2 syntax 
ggplot(data = mtcars) + geom_point(aes(x=wt, y = mpg)) 

# 4. This is not 
geom_point(aes(ggplot(data = mtcars), x=wt, y = mpg)) 

ggplot2 zawiera specjalny "+" metodę ggplot przedmiotów, których używa, aby dodać do warstwy działek. Nie wiedziałem, dopóki nie zadałeś pytania, że ​​działa ono również z funkcją aes(), ale najwyraźniej jest to również zdefiniowane. Wszystkie są specjalnie zdefiniowane w ggplot2. Używanie + w ggplot2 poprzedza potok i chociaż użycie jest podobne, funkcjonalność jest zupełnie inna.

Jako ciekawostkę marginesie, Hadley Wickham (twórca ggplot2) said that:

... gdybym odkrył rura wcześniej, tam nigdy nie byłem ggplot2, bo mógł napisać grafiki ggplot jak

ggplot(mtcars, aes(wt, mpg)) %>% 
    geom_point() %>% 
    geom_smooth() 
+2

pojawia się pytanie, dlaczego działa # 3? – baptiste

+4

Być może trochę szczęścia z pierwszeństwem operatora, wydaje się, że rura ma pierwszeństwo przed metodą '+' ggplota. – Gregor

+2

... co wydaje się ogólnie prawdziwe: '10 + 1: 2%>% sum()' daje 13, gdzie '(10 + 1: 2)%>% sum()' daje 23. – Gregor