2016-07-08 35 views
4

我試圖以編程方式繪製分佈使用ggplot2。非標準評估,lapply和ggplot

我不知道如何在這裏使用非標準評估(NSE)(甚至在閱讀過哈德利的書籍章節等NSE)。

考慮下面的代碼:

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)) 

此代碼確實產生許多密度圖的,每列一個,確定。但是,它不會而不是打印被繪製的變量的名稱。而是打印佔位符變量x(參見圖)。

plot resulting from code above

我的目標是讓x報價由真實變量名稱取代,例如,mpg

+0

感謝理查德,但對我來說 –

+1

不工作,你只是試驗(即是這樣的學習練習)?如果不是,'aes_string()'很大程度上幫助變量subst。 – hrbrmstr

+3

'x'(在lapply循環中)是一個未命名的原子向量。它沒有與'substitute'一起使用的名稱。 – LyzandeR

回答

1

lapply不會使用您現在正在解決此問題的功能。 x只是傳遞給該函數時的一個向量,它不是該變量的名稱,並且lapply不會傳遞任何表示的名稱。換句話說,該函數的範圍中沒有任何東西可以找出適當的x軸標籤。

一種解決方案是類似於@Jimbou:

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

或者只是使用方面,而不是:

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

謝謝@Axeman,解決了這個問題。我現在更瞭解NSE和ggplot。 –

1

你可以試試:

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) 

的想法是遍歷列索引。 aes_將字符串與as.name一起轉換爲名稱。