2011-11-07 29 views
7

Mam serię wykresów ggplot, które powtarzam w kilku niewielkich odmianach. Chciałbym zawrzeć te spacje z ich opcjami w funkcji, aby uniknąć wielu powtórzeń w kodzie.Pisanie funkcji ggplot w R z opcjonalnymi argumentami

Mój problem polega na tym, że dla niektórych wykresów używam opcji + facet_wrap(), ale dla innych nie jestem. To znaczy. Potrzebuję, aby folia aspektu była opcjonalnym argumentem. Gdy zostanie uwzględniony, kod musi wywołać funkcję + facet_wrap() ze zmienną podaną w argumencie faset.

Więc idealnie moja funkcja będzie wyglądać tak, ze aspekty bycia opcjonalny argument:

$ qhist(variable, df, heading, facets) 

Próbowałem googlowania jak dodać opcjonalne argumenty i sugerują one albo przekazując wartość domyślną lub stosując jeśli pętla z funkcja missing(). Nie byłem w stanie zabrać się do pracy.

Oto funkcja, którą napisałem, z uwzględnieniem pożądanej funkcjonalności opcjonalnego argumentu aspektu.

$ qhist <- function(variable, df, heading, facets) { 
     qplot(variable, data = df, geom = "histogram", binwidth = 2000, 
      xlab = "Salary", ylab = "Noms") + 
     theme_bw() + 
     scale_x_continuous(limits=c(40000,250000), 
       breaks=c(50000,100000,150000,200000,250000), 
       labels=c("50k","100k","150k","200k","250k")) + 
     opts(title = heading, plot.title = theme_text(face = "bold", 
      size = 14), strip.text.x = theme_text(size = 10, face = 'bold')) 
     # If facets argument supplied add the following, else do not add this code 
     + facet_wrap(~ facets) 
+0

Czy "aspekty" będą logiczne?Albo coś innego? (wektor znaków zmiennych do aspektu?) –

+0

Nie byłoby zmienną do aspektu. Na przykład mam histogramy danych pensji, a czasami chcę je analizować według branży. –

Odpowiedz

11

sposób ustawić domyślną jest tak:

testFunction <- function(requiredParam, optionalParam=TRUE, alsoOptional=123) { 
    print(requiredParam) 
    if (optionalParam==TRUE) print("you kept the default for optionalParam") 
    paste("for alsoOptional you entered", alsoOptional) 
} 

* EDIT *

Oh, ok ... więc myślę, że mam lepszy pomysł o to, o co prosisz. Wygląda na to, że nie wiesz, jak wprowadzić opcjonalny aspekt do obiektu ggplot. Co powiesz na to:

qhist <- function(variable, df, heading, facets=NULL) { 
    d <- qplot(variable, data = df, geom = "histogram", binwidth = 2000, 
     xlab = "Salary", ylab = "Noms") + 
    theme_bw() + 
    scale_x_continuous(limits=c(40000,250000), 
      breaks=c(50000,100000,150000,200000,250000), 
      labels=c("50k","100k","150k","200k","250k")) + 
    opts(title = heading, plot.title = theme_text(face = "bold", 
     size = 14), strip.text.x = theme_text(size = 10, face = 'bold')) 
    # If facets argument supplied add the following, else do not add this code 
    if (is.null(facets)==FALSE) d <- d + facet_wrap(as.formula(paste("~", facets))) 
    d 
    return(d) 
    } 

Nie testowałem tego kodu w ogóle. Ale generalnie idea facet_wrap oczekuje formuły, więc jeśli fasety są przekazywane jako ciąg znaków, można zbudować formułę z as.formula(), a następnie dodać ją do obiektu fabuły.

Gdybym to zrobił, chciałbym, aby funkcja przyjęła opcjonalną formułę aspektu, a następnie przekazać tę formułę aspektu bezpośrednio do facet_wrap. To neguje potrzebę wywołania as.formula(), aby przekonwertować tekst na formułę.

+0

Pozdrawiam, myślę, że dostaję to, myślę, że nadal nie rozumiem, jak użyć tej struktury, aby następnie włączyć opcję w kodzie, który jest wywoływany przez funkcję. Zaktualizuję moje pytanie, aby to odzwierciedlić. –

+0

W swoim ciele funkcji, spróbuj czegoś takiego jak 'res <- qplot (...) + ...; if (aspekty) res <- res + facet_wrap (~ aspekty); return (res) ' – Tyler

+0

Biorąc pod uwagę dość niestandardową ocenę' zmiennej' w 'qplot', lepiej byłoby z użyciem składni' ggplot' i używając 'aes_string':' d <- ggplot (data = df, aes_string (x = zmienna)) + geom_histogram (binwidth = 2000) + ... ' –

2

Należy pamiętać, że można również użyć parametru missing(facets), aby sprawdzić, czy argument aspektów został określony, czy nie. Jeśli używasz rozwiązania @JD Longa, to będzie wyglądać mniej więcej tak:

qhist <- function(variable, df, heading, facets) { 
    ... insert @JD Longs' solution ... 

    if (!missing(facets)) d <- d + facet_wrap(as.formula(paste("~", facets))) 
    return(d) 
} 

... Zauważ, że ja również zmienić domyślny argumentu z facets=NULL tylko facets.

Wiele funkcji R używa brakujących argumentów takich jak ta, ale ogólnie preferuję wariant @JD Long przy użyciu domyślnej wartości argumentu (np. NULL lub NA), gdy jest to możliwe. Ale czasami nie ma dobrej wartości domyślnej ...

+0

Dziękujemy za udostępnienie innej opcji. Widziałam to już, ale nie mogłam się dowiedzieć, jak włączyć tę funkcję do mojej konkretnej funkcji. –

3

Prawdopodobnie najlepszym sposobem jest zaprzestanie używania tak nietypowych nazw zmiennych, w tym przecinków lub spacji.

Jako obejście, tutaj znajduje się przedłużenie odpowiedzi @ JDLong. Sztuczka polega na zmianie nazwy zmiennej aspektu.

f <- function(dat, facet = NULL) { 
    if(!missing(facet)) { 
     names(dat)[which(names(dat) == facet)] <- ".facet." 
     ff <- facet_wrap(~.facet.) 
    } else { 
     ff <- list() 
    } 
    qplot(x, y, data = dat) + ff 
} 

d <- data.frame(x = 1:10, y = 1:10, "o,o" = gl(2,5), check.names=F) 

f(d, "o,o") 
f(d) 
+0

Niestety, "Handel detaliczny" jest faktycznie jednym z ciągów w zmiennej. Sama zmienna nosi nazwę "branża". –

+0

Następnie nie powoduje żadnego błędu. Być może są pewne błędy w używaniu. Czy mógłbyś dołączyć dołączony przykład? – kohske

+0

masz rację. Mój problem polegał na tym, że nie obejmowałem argumentu jako łańcucha znaków. –

Powiązane problemy