2012-03-02 16 views
5

Planuję wiele podobnych wykresów, więc pomyślałem, że napisałem funkcję upraszczającą zadanie. Chciałbym przekazać to data.frame i nazwę kolumny do wykreślenia. Oto co próbowałem:Jak przekazywać nazwy kolumn do funkcji przetwarzającej data.frames

plot_individual_subjects <- function(var, data) 
{ 
    require(ggplot2) 

    ggplot(data, aes(x=Time, y=var, group=Subject, colour=SubjectID)) + 
    geom_line() + geom_point() + 
    geom_text(aes(label=Subject), hjust=0, vjust=0) 
} 

Teraz jeśli var jest ciągiem to nie będzie działać. To nie zadziała, jeśli zmieni się aes część polecenia ggplot na y=data[,var] i będzie narzekać na brak możliwości podzbioru zamknięcia.

Jaki jest właściwy sposób/najlepsza praktyka rozwiązania tego i podobnych problemów? W jaki sposób mogę łatwo i bezpiecznie przekazywać nazwy kolumn do funkcji, które chciałyby wykonywać przetwarzanie w data.frames?

+2

Zamiast tego użyj 'aes_string'. – joran

+1

@joran możesz równie dobrze zaksięgować to jako odpowiedź. – Justin

Odpowiedz

10

Bad Joran, odpowiadając w komentarzach!

Chcesz użyć aes_string, która pozwala przekazywać nazwy zmiennych jako ciągi. W twoim konkretnym przypadku, ponieważ wydaje się, że chcesz tylko zmodyfikować zmienną y, prawdopodobnie chcesz zreorganizować, które estetykę są odwzorowane w jakich geach. Na przykład może coś takiego:

ggplot(data, aes_string(y = var)) + 
    geom_line(aes(x = Time,group = Subject,colour = SubjectID)) + 
    geom_point(aes(x = Time,group = Subject,colour = SubjectID)) + 
    geom_text(aes(x = Time,group = Subject,colour = SubjectID,label = Subject),hjust =0,vjust = 0) 

lub na odwrót, w zależności od gustów.

+0

joran, czy istnieje sposób na połączenie aes() i aes_string() w tym samym wywołaniu ggplot? to jest, jeśli moja oś X jest zawsze wspólna dla wszystkich geomów, umieszczenie jej w wywołaniach geom wydaje się być trochę niezgrabne – KarateSnowMachine

+2

@KarateSnowMachine Nie można używać zarówno 'aes', jak i' aes_string' w tej samej warstwie. Zawsze możesz po prostu zamapować go w 'aes_string' jako' x = 'Time'', itd. – joran

+0

dzięki, nie zdawałem sobie sprawy, że to było takie łatwe. – KarateSnowMachine

Powiązane problemy