2011-01-29 6 views
23

Si trato de componer manualmente algunos elementos de una parcela ggplot2, funciona muy bien:¿Cómo puedo combinar múltiples elementos ggplot2 en el retorno de una función?

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

Pero si intento para agrupar algunos de la composición en una función, me sale un error:

> 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 

¿Me falta algo en la notación ggplot2 para combinar correctamente ggplot2 elementos dentro de un cuerpo de función?

+2

Creo que el operador '+' requiere que uno de los argumentos sea de la clase 'ggplot' para que funcione correctamente su magia. Los geoms no son objetos 'ggplot', pero el argumento' p' es. – Sharpie

Respuesta

45

ggplot2 apoya "lista" de los elementos:

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

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

que pueda mantenerse en una lista cualquier pieza que ggplot2 devuelve la función, incluyendo laboratorios(), opta(), etc, y luego usar "+" para bind capa base ggplot2 y la pieza en la lista.

Probablemente esta característica no es muy conocida, pero es muy útil cuando alguien quiere volver a utilizar un elemento.

+1

También vea el buen tutorial de Hadley (mediados de 2015) sobre esta cuestión exacta: https://rpubs.com/hadley/97970 –

Cuestiones relacionadas