5

ggplot2 を使用してプログラムで分布をプロットしようとしています。

ここで非標準評価(NSE)を扱う方法がわかりません(NSEに関するHadleyの本の章などを読んだ後でも)。

次のコードを検討してください。

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

このコード、列ごとに 1 つずつ、多数の密度プロットを生成します。ただし、プロットされている変数の名前は出力されません。代わりに、プレースホルダー変数xが出力されます (図を参照)。

上記のコードから得られるプロット

私の目標は、x引用符を実際の変数名に置き換えることですmpg

4

2 に答える 2

1

lapplyこれを解決するために現在持っている機能では機能しません。xその関数に渡されるときは単なるベクトルであり、その変数の名前ではなく、名前であるものlapply何も渡していません。言い換えれば、その関数のスコープには、適切な x 軸ラベルを決定するものは何もありません。

1つの解決策は@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')
于 2016-07-08T12:54:01.620 に答える
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

于 2016-07-08T11:58:08.257 に答える