2011-01-29 24 views
23

Gdy próbuję ręcznie tworzyć pewne elementy ggplot2 działce, to działa dobrze:Jak mogę połączyć wiele elementów ggplot2 w zwrot funkcji?

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

Ale gdy próbuję związać kilka kompozycji do funkcji, pojawia się błąd:

> 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 

Czy brakuje mi czegoś w notacji ggplot2 do poprawnego łączenia elementów wewnątrz ciała funkcyjnego z ggplot2?

+2

Myślę, że operator '+' wymaga jednego z argumentów, aby być klasy "ggplot", aby poprawnie działać jej magią. Geomeny nie są obiektami typu "ggplot", ale działka 'p' jest. – Sharpie

Odpowiedz

45

ggplot2 obsługuje "list" z następujących elementów:

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

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

można przechowywać na liście dowolny kawałek, który ggplot2 powraca funkcyjnych, w tym laboratoriów(), wybiera(), itp, a następnie za pomocą "+" dla warstwy bazowej bind ggplot2 i elementu na liście.

Prawdopodobnie ta funkcja nie jest powszechnie znana, ale jest bardzo przydatna, gdy ktoś chce ponownie użyć elementu.

+1

Zobacz także ładny tutorial Hadley'a (połowa 2015 r.) Na ten temat: https://rpubs.com/hadley/97970 –

Powiązane problemy