2016-07-08 16 views
4

私はプログラムでggplot2を使って分布をプロットしようとしています。非標準的な評価lapplyとggplot

(NSEでHadleyの書籍の章などを読んだ後でも)ここで非標準評価(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)) 

はOK、密度プロット、各列に対して1つの数を生成ありません。しかし、ではないはプロットされている変数の名前を表示します。むしろ、プレースホルダー変数xが印刷されます(図参照)。

plot resulting from code above

私の目標は、実際の変数名で置換されていx引用、例えば、mpgを持つことです。

+0

おかげでリチャードが、私のために動作しません –

+1

は、あなただけのつまり(実験すると、このaはある

一つの解決策は、@Jimbouに似ています学習運動)?そうでなければ、 'aes_string()'は変数substを大きく助けます。 – hrbrmstr

+3

'x'(ループ内で)は無名の原子ベクトルです。 'substitute'と一緒に使う名前はありません。 – LyzandeR

答えて

1

lapplyは、今解決している機能では機能しません。 xは、その関数に渡されたときの単純なベクトルです。変数の名前ではありません。lapplyは、という名前のものを渡していません。言い換えれば、適切なx軸ラベルが何であるべきかを理解するための関数の範囲には何もありません。

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とともに名前に変換します。

関連する問題