2016-02-11 16 views
10

Was ist der Unterschied zwischen dem Operator "+" in ggplot2 und dem Operator "%>%" in magritr?Was ist der Unterschied zwischen dem Operator "+" in ggplot2 und dem Operator "%>%" in magritr?

Mir wurde gesagt, dass sie gleich sind, wenn wir jedoch das folgende Skript betrachten.

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

auch tangential Sie nicht alle diese Einfuhren müssen schreiben. Wenn Sie sie in Ihr Beispiel einbeziehen, ist es schwierig, Überlagerungen aus der Bibliothek auszuschließen. –

+3

Ich habe Ihre Frage so bearbeitet, dass anstelle der eigenen Daten integrierte Daten verwendet werden, um nicht verwendete Pakete zu entfernen und das Ganze kopier- und einfügbar zu machen. – Gregor

Antwort

13

Piping ist sehr verschieden von ggplot2 ‚s hinaus. Was der Rohroperator %>% tut, nimmt das Ergebnis der linken Seite und setzt es als erstes Argument der Funktion auf der rechten Seite. Zum Beispiel:

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

ist genau äquivalent zu mean(1:10). Das Rohr ist nützliches mehrfach verschachtelte Funktionen zu ersetzen, beispielsweise

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() 

aber das ist alles in What does %>% mean in R? schön über erklärt, sollten Sie durch, dass für ein paar weiteren Beispiele lesen.

Mit diesem Wissen können wir Ihre Pipe-Beispiele als verschachtelte Funktionen neu schreiben und sehen, dass sie immer noch dieselben Dinge tun; aber jetzt ist es (hoffentlich) ist offensichtlich, warum # 4 funktioniert nicht:

# 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 enthält eine spezielle "+" Methode für ggplot Objekte, die sie verwendet, Schichten zu Plots hinzuzufügen. Ich wusste nicht, bis Sie Ihre Frage gestellt haben, dass es auch mit der Funktion aes() funktioniert, aber anscheinend ist das auch definiert. Diese sind alle speziell innerhalb ggplot2 definiert. Die Verwendung von + in ggplot2 ist älter als die Pipe, und obwohl die Verwendung ähnlich ist, ist die Funktionalität ziemlich unterschiedlich.

Als interessante Randnotiz, Hadley Wickham (der Schöpfer von ggplot2) said that:

... wenn ich das Rohr früher entdeckt hatte, es nie eine ggplot2 gewesen wäre, weil Sie könnte ggplot Grafiken als

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

die Frage wird, warum funktioniert # 3? – baptiste

+4

Vielleicht ein wenig Glück mit dem Vorrang des Operators, es scheint, dass die Pipe Vorrang vor ggplot '+' Methode hat. – Gregor

+2

... scheint allgemein zu stimmen: '10 + 1: 2%>% sum()' ergibt 13, wobei '(10 + 1: 2)%>% summe()' 23 ergibt. – Gregor

Verwandte Themen