2013-04-30 10 views
10

Potrzebuję zawinąć ggplot2 w inną funkcję i chcę móc analizować zmienne w taki sam sposób, w jaki są akceptowane, czy ktoś może sterować mną we właściwym kierunku.Przekazywanie argumentów do ggplota w opakowaniu

Powiedzmy na przykład, że rozważamy poniżej MWE.

#Load Required libraries. 
library(ggplot2) 

##My Wrapper Function. 
mywrapper <- function(data,xcol,ycol,colorVar){ 
    writeLines("This is my wrapper") 
    plot <- ggplot(data=data,aes(x=xcol,y=ycol,color=colorVar)) + geom_point() 
    print(plot) 
    return(plot) 
} 

Dummy danych:

##Demo Data 
myData <- data.frame(x=0,y=0,c="Color Series") 

Istniejące Wykorzystanie który wykonuje bez kłopotów:

##Example of Original Function Usage, which executes as expected 
plot <- ggplot(data=myData,aes(x=x,y=y,color=c)) + geom_point() 
print(plot) 

składnia Wykorzystanie Cel:

##Example of Intended Usage, which Throws Error ----- "object 'xcol' not found" 
mywrapper(data=myData,xcol=x,ycol=y,colorVar=c) 

Powyższe podaje przykład "oryginalnego" użycia przez pakiet ggplot2 i jak chciałbym go zawinąć w inną funkcję. Opakowanie jednak powoduje błąd.

Jestem pewien, że to odnosi się do wielu innych zastosowań, i to prawdopodobnie został odpowiedział tysiąc razy, jednak nie jestem pewien, co ten temat jest „o nazwie” w R.

Odpowiedz

9

Problem polega na tym, że ggplot szuka w obiekcie danych obiektu column o nazwie xcol. Polecam, aby przełączyć się za pomocą aes_string i przechodzącej nazwy kolumn chcesz map przy użyciu znaków, np:

mywrapper(data = "myData", xcol = "x", ycol = "y", colorVar = "c") 

i modyfikować swoje opakowanie odpowiednio:

mywrapper <- function(data,xcol,ycol,colorVar){ 
    writeLines("This is my wrapper") 
    plot <- ggplot(data=data, aes_string(x = xcol, y = ycol, color = colorVar)) + geom_point() 
    print(plot) 
    return(plot) 
} 

Kilka uwag:

  1. Osobiste preferencje, używam dużo przestrzeni wokół np. x = 1, dla mnie znacznie poprawia to czytelność. Bez spacji kod wygląda jak duży blok.
  2. Jeśli zwrócisz wykres poza funkcję, nie wydrukowałbym go wewnątrz funkcji, ale tuż poza funkcją.
+0

Dzięki, nie wiedziałem, że istnieje opcja aes_string, ale czy nie ma sposobu na przekazanie "nazwy", to znaczy, w jaki sposób funkcja ggplot2 wie, co oznaczają te argumenty. –

+0

Istnieją sposoby na uzyskanie nazwy obiektu, ggplot2 używa tego pod maską w 'aes', ale do przekazywania takich argumentów' aes_string' jest znacznie łatwiejsze. –

+0

Witam, jest to bardzo przydatna odpowiedź. Używam tego rozwiązania do opracowania opakowania na histogram. Jednak w moim kodzie mam kod do generowania linii środkowej 'geom_vline (aes (xintercept = mean (histogramVariable)), color = 'red'' .Jak mądrze przekazać' histogramVariable' jako 'data $ histogramVariable' do tego? – Konrad

Powiązane problemy