2016-02-11 11 views
10

Qual è la differenza tra l'operatore "+" in ggplot2 e l'operatore "%>%" in magrittr?Qual è la differenza tra l'operatore "+" in ggplot2 e l'operatore "%>%" in magrittr?

Mi è stato detto che sono uguali, tuttavia se consideriamo il seguente script.

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

Inoltre, tangenzialmente, non avete bisogno di tutte queste importazioni. Includerli nel tuo esempio rende difficile escludere interferenze tra le librerie. –

+3

Ho modificato la tua domanda per utilizzare i dati incorporati invece dei tuoi dati personali, per eliminare i pacchetti non utilizzati e per rendere il tutto copia/incollabile. – Gregor

risposta

13

Piping è molto diverso da oltre ggplot2 s'. Ciò che l'operatore di pipe, %>%, fa è prendere il risultato del lato sinistro e metterlo come primo argomento della funzione sul lato destro. Ad esempio:

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

È esattamente equivalente a mean(1:10). Il tubo è più utile sostituire funzioni nidificate moltiplicano, ad esempio,

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

ma questo è spiegato ben oltre a What does %>% mean in R?, si dovrebbe leggere che per un paio di esempi.

Utilizzando questa conoscenza, possiamo riscrivere i vostri esempi di pipe come funzioni annidate e vedere che fanno ancora le stesse cose; ma ora è (si spera) è evidente il motivo per cui # 4 non funziona:

# 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 include uno speciale metodo di "+" per ggplot oggetti, che utilizza per aggiungere livelli a trame. Non lo sapevo finché non hai fatto la tua domanda che funziona anche con la funzione aes(), ma a quanto pare è definita anche questa. Questi sono tutti definiti in modo specifico all'interno di ggplot2. L'uso di + in ggplot2 è precedente alla pipa e, sebbene l'utilizzo sia simile, la funzionalità è abbastanza diversa.

Come un interessante side-nota, Hadley Wickham (il creatore di ggplot2) said that:

... se avessi scoperto il tubo in precedenza, non c'è mai sarebbe stata una ggplot2, perché si potrebbe scrivere grafica ggplot come

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

la domanda diventa, perché funziona # 3? – baptiste

+4

Forse un po 'di fortuna con la precedenza dell'operatore, sembra che la pipe abbia la precedenza sul metodo '+' di ggplot. – Gregor

+2

... che sembra essere generalmente vero: '10 + 1: 2%>% sum()' dà 13, dove '(10 + 1: 2)%>% sum()' dà 23. – Gregor

Problemi correlati