2017-06-14 12 views
9

比較的シンプルなラッパーを作成してプロットを作成しようとしましたが、グループ化変数の整頓評価を指定する方法はありません...変数をファセットしてグループ化することはできません。 ..Tidy評価プログラミングとggplot2

my_plot <- function(df = starwars, 
        select = c(height, mass), 
        ...){ 
    results <- list() 
    ## Tidyeval arguments 
    quo_select <- enquo(select) 
    quo_group <- quos(...) 
    ## Filter, reshape and plot 
    results$df <- df %>% 
        dplyr::filter(!is.na(!!!quo_group)) %>% 
        dplyr::select(!!quo_select, !!!quo_group) %>% 
        gather(key = variable, value = value, !!!quo_select) %>% 
        ## Specify what to plot 
        ggplot(aes(value)) + 
        geom_histogram(stat = 'count') + 
        facet_wrap(~variable, scales = 'free', strip.position = 'bottom') 
    return(results) 
} 
## Plot height and mass as facets but colour histograms by hair_color 
my_plot(df = starwars, select = c(height, mass), hair_color) 

どのように違いがあるのですか?hair_color?通常、これは私が(私は思う)私が見たり、持って働くことができない代わりに

​​

aes_()を使用する必要があります(つまり、quo_groupaes()内で行われますが、これはquos()の結果を使用しているので、今Programming with dplyr数回読んで私は間違っている。

誰かが私のエラーを指摘できますか/私に方法を教えてください。

+0

2番目の関数では、なぜ 'ggplot(aes(etc))'という2行がありますか? – FlorianGD

+0

'quos(...)'の代わりに 'quo(...)'を使うと、 'aes_' a la' aes_(〜value、color = quo_group) 'で問題なく動作します。しかし、何かのために変数をグループ化する必要があるかもしれません。 – aosmith

+1

ああ、わかりました。 'quos'はリストを返します。したがって、 'quos(...)'から得られる1要素リストの最初の要素だけを使いたい場合は 'aes_'に' color = quo_group [[1]] 'が必要です。 – aosmith

答えて

0

質問が分かりません。これは要件を満たしていますか?

library(ggplot2) 
library(data.table) 

your_plot <- function(df, select, color=NULL) { 

    df <- as.data.table(df)[, mget(na.omit(c(select, color)))] 

    ggplot(melt(df, color, select), aes_string(x=quote(value), color=color)) + 
    geom_histogram(stat="count") + 
    facet_wrap(~variable, scales="free", strip.position="bottom") 

} 

your_plot(dplyr::starwars, c("height", "mass"), "hair_color") 

これは、各スタックに対して繰り返さcolor変数(複数可)と、select変数を積層するmeltを使用します。 color=NULLのときにはaes(x=value, color=color)が失敗するため、aes_stringも使用されます。