2016-07-08 11 views
4

Ich versuche, Verteilungen mit ggplot2 programmatisch zu plotten.Nicht standardmäßige Auswertung, lapply und ggplot

Ich kann hier nicht herausfinden, wie man mit nicht standardmäßiger Auswertung (NSE) arbeitet (auch nachdem ich Hadleys Buchkapitel usw. auf NSE gelesen habe).

Betrachten Sie den folgenden Code ein:

library(ggplot2) 


gg_dens <- function(x){ 
    eval(ggplot(data.frame(x), aes_string(x = substitute(x))) + geom_density() + 
     ggtitle(substitute(x)), data.frame(x)) 
} 


lapply(mtcars, function(x) gg_dens(x)) 

Dieser Code tut eine Reihe von Dichtekurven zu erzeugen, eine für jede Spalte, ok. Es tut jedoch nicht Drucken Sie den Namen der Variablen, die geplottet wird. Vielmehr wird die Platzhaltervariable x gedruckt (siehe Abbildung).

plot resulting from code above

Mein Ziel ist es, das x Zitat durch die reellen Variablen Namen ersetzt zu haben, z. B. mpg.

+0

Dank Richard, aber für mich –

+1

experimentieren nicht funktioniert einfach (dh dies ist ein Lernübung) Wenn nicht, hilft 'aes_string()' mit Variablen subst sehr. – hrbrmstr

+3

'x' (in der Lapply-Schleife) ist ein unbenannter atomarer Vektor. Es hat keinen Namen, der mit 'substitute' verwendet werden kann. – LyzandeR

Antwort

1

lapply wird nicht mit der Funktion arbeiten, die Sie gerade haben, um dies zu lösen. x ist einfach ein Vektor, wenn diese Funktion übergeben wird, ist es nicht der Name dieser Variablen, und lapply gibt nichts weiter, ist der Name. Mit anderen Worten, es gibt nichts im Rahmen dieser Funktion, um herauszufinden, was die richtige x-Achsen-Markierung sein soll.

Eine Lösung ist ähnlich wie @Jimbou:

gg_dens <- function(name, dat) { 
    ggplot(dat, aes_string(x = name)) + geom_density() + ggtitle(name) 
}  
lapply(names(mtcars), gg_dens, mtcars) 

oder Facetten nur statt:

mtcars2 <- tidyr::gather(mtcars) 
ggplot(mtcars2, aes(value)) + geom_density() + facet_wrap(~key, scales = 'free') 
+1

Dank @Axeman, das das Problem gelöst hat. Und ich verstehe jetzt NSE und ggplot besser. –

1

können Sie versuchen:

gg_dens <- function(x, y){ 
    ggplot(y, aes_(x = as.name(colnames(y)[x]))) + geom_density() + ggtitle(colnames(y)[x]) 
} 

lapply(1:ncol(mtcars), gg_dens, mtcars) 

Die Idee ist, durch den Spaltenindex in einer Schleife. Die aes_ konvertieren Zeichenfolgen in Namen zusammen mit as.name.