2016-07-03 91 views
10

Sto cercando di ottenere questo esempio:Segno più tra ggplot2 e l'altra funzione (R)

ggplot (MPG, AES (VISUAL, Hwy)) + geom_point()

Can qualcuno mi spiega cosa sta succedendo qui tra queste 2 funzioni?

ggplot2 sovraccarico "più" operatore? Qual è il risultato di riassumere questi 2 e a cosa è assegnato? È una funzione specifica per R o specifica per ggplot2? È una specie di tubo?

+9

Non è facile da trovare, ma 'help (" +. Gg ")' contiene le informazioni desiderate. Ho scoperto che '+ .gg' esiste usando' methods ("+") 'con ggplot2 caricato. –

+6

Sì e no; è effettivamente una pipe (Hadley ha scoperto/coauthored magrittr dopo ggplot2 e ha detto che è troppo tardi per cambiare ggplot ora), ma in realtà si sta aggiungendo a un oggetto ggplot, che non viene tracciato fino a quando la chiamata non è completa. Quindi sì, puoi pensare che passi il parametro 'data' tra le funzioni, ma è più utile considerarlo come ... additivo. Avvia un grafico in 'ggplot_build' per avere un'idea di cosa sono gli oggetti all'interno. – alistaire

+0

Grazie ragazzi, per la spiegazione! – mimic

risposta

3

La definizione della funzione che @Richard Scriven fa riferimento nel commento è definita in plot-construction.r, che potrebbe renderlo più chiaro. Avrai bisogno di passare attraverso la fonte per vedere esattamente cosa fanno queste due (non esportate) funzioni (se l'LHS della chiamata è un theme o un oggetto ggplot) ma i nomi dovrebbero darti una buona idea. Il valore restituito è e1 modificato da "aggiunta" e2.

"+.gg" <- function(e1, e2) { 
    # Get the name of what was passed in as e2, and pass along so that it 
    # can be displayed in error messages 
    e2name <- deparse(substitute(e2)) 

    if  (is.theme(e1)) add_theme(e1, e2, e2name) 
    else if (is.ggplot(e1)) add_ggplot(e1, e2, e2name) 
} 

Quindi, sì, + è sovraccarico per gli oggetti che ereditano classe gg (tutti ggplot2 oggetti).

Penso che "pipe" (il commento di @alistaire) sia un'analogia fuorviante; questo è molto nello stile del gruppo Ops standard generico.