2017-12-18 8 views
7

私は次のデータセット(サンプル)があります:私は手動で列名を入力プログラムときには正常に動作しますpurrrを使ってきちんとした評価関数をループする方法は?

get_charts1 <- function(mygroup){ 
    quo_var <- enquo(mygroup) 
    train %>% 
    group_by(!!quo_var) %>% 
    count() %>% 
    ungroup() %>% 
    ggplot(aes_q(x = quo_var, y = quote(n), fill = quo_var)) + 
    geom_col() + 
    theme(legend.position = "none") 
    } 

:私はgroup_by()操作のためのggplotを示し、以下の機能を持っている

train <- data.frame(ps_ind_06_bin = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE), 
         ps_ind_07_bin = c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), 
         ps_ind_08_bin = c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE), 
         ps_ind_09_log = c(1, 3, 4, 2, 3, 2)) 

を例えば:

get_charts1(ps_ind_07_bin) 

はしかし、私はベクター上に置くいくつかの列、上の機能を使用したい:

binarias <- train %>% 
      select(ends_with("bin")) %>% 
      colnames() 

マップを使用していくつかの提案を取って、私が使用しようとした:

listaplots <- map(quo(!!! syms(binarias)), get_charts1) 

しかし、これは私に次のエラーを与える:

"Error: Can't splice at top-level" 

誰もが私が何をする必要があるか知っていますこれを動作させるには?

+0

簡単です'map(quos(ps_ind_06_bin、ps_ind_07_bin)、get_charts1)'のようなksは動作しませんので、問題は実際には展開ではありません。 'map()'のように、パラメータの評価を強制しているようです。 – MrFlick

+0

強制的なオブジェクト(強制的なquosureまたはシンボルを含む)のキャプチャは、次のrlangバージョンでそのまま使用できます。これは引用符を取り除くことと同じです。 – lionel

+0

[誰かが私の質問に答えたときに何をすべきですか?](https://stackoverflow.com/help/someone-answers) – zx8754

答えて

2

mapではなく、invoke_mapとしたいと思います。これは、あなたがmap()invoke_mapはそうではないパラメータの評価を強制的に思わ

listaplots <- invoke_map(get_charts1, rlang::syms(binarias)) 

を望むものを与えているようです。

1

変更enquo()sym()にし、あなたのコードは次のように正常に動作します:

get_charts1 <- function(mygroup){ 
    quo_var <- sym(mygroup) # <- HERE 

    train %>% 
     group_by(!!quo_var) %>% 
     count() %>% 
     ungroup() %>% 
     ggplot(aes_q(x = quo_var, y = quote(n), fill = quo_var)) + 
     geom_col() + 
     theme(legend.position = "none") 
} 

binarias <- train %>% select(ends_with("bin")) %>% colnames() 

binarias %>% map(get_charts1) 
9

私は(あなたが非常に接近していたが、 が必要なパッケージをロードするのを忘れて) reprexを作成することによって開始するつもりです、そして、stylerを使用して一貫性のある形式 にスタイルを再:

library(tidyverse) 
library(rlang) 

train <- data.frame(
    ps_ind_06_bin = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE), 
    ps_ind_07_bin = c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), 
    ps_ind_08_bin = c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE), 
    ps_ind_09_log = c(1, 3, 4, 2, 3, 2) 
) 

get_charts <- function(mygroup) { 
    quo_var <- enquo(mygroup) 
    train %>% 
    group_by(!! quo_var) %>% 
    count() %>% 
    ungroup() %>% 
    ggplot(aes_q(x = quo_var, y = quote(n), fill = quo_var)) + 
    geom_col() + 
    theme(legend.position = "none") 
} 

あなたはこのようなコードの生成を自動化したい:

get_charts(ps_ind_06_bin) 
get_charts(ps_ind_07_bin) 
get_charts(ps_ind_08_bin) 

これには、forループまたはapply/map関数が必要です。 A map() は、ggplot2オブジェクトを返したいので、ここでうまくいきます。そして、 を実行すると、forループではさらにインフラストラクチャが必要になります。あなたがここに記号を使用する必要があることを覚えて一度は、ルーない 生の文字列

vars <- train %>% select(ends_with("bin")) %>% colnames() 

vars %>% 
    syms() %>% 
    map(function(var) get_charts(!!var)) 

## [[1]] 

## 
## [[2]] 

## 
## [[3]] 

関連する問題