2011-01-29 2 views
23

Se provo a comporre manualmente alcuni elementi di una trama ggplot2, funziona bene:Come posso combinare più elementi ggplot2 nel ritorno di una funzione?

> p <- ggplot(aes(x = mpg, y = hp), data = mtcars) 
> p + geom_vline(xintercept = 20) + geom_point(data = mtcars) 

Ma se cerco di riunire alcuni della composizione in una funzione, ottengo un errore:

> myFunction <- function() { 
+ return(
+  geom_vline(xintercept = 20) + geom_point(data = mtcars) 
+ ) 
+ } 
> p <- ggplot(aes(x = mpg, y = hp), data = mtcars) 
> p + myFunction() 
Error in geom_vline(xintercept = 20) + geom_point(data = mtcars) : 
    non-numeric argument to binary operator 

Mi manca qualcosa nella notazione ggplot2 per combinare correttamente gli elementi ggplot2 all'interno di un corpo di una funzione?

+2

Penso che l'operatore '+' richiede che uno degli argomenti sia di classe 'ggplot' per poter funzionare correttamente la sua magia. Le geome non sono oggetti 'ggplot' ma la trama' p' è. – Sharpie

risposta

45

ggplot2 supporta "lista" degli elementi:

myFunction <- function() 
list(geom_vline(xintercept = 20), 
     geom_point(data = mtcars)) 

p <- ggplot(aes(x = mpg, y = hp), data = mtcars) 
p + myFunction() 

si può tenere in un elenco qualsiasi pezzo che ggplot2 restituisce la funzione, tra cui laboratori(), opta(), ecc, e quindi utilizzare "+" per associare il livello di base ggplot2 e il pezzo nell'elenco.

Probabilmente questa funzione non è molto nota, ma è molto utile quando qualcuno vuole riutilizzare un pezzo di elementi.

+1

Vedi anche il bel tutorial di Hadley (metà 2015) su questa cosa esatta: https://rpubs.com/hadley/97970 –