2017-09-19 21 views
3

invoke_mapを使用して関数のリストを呼び出したいとします。私は、それぞれの関数の引数として使用したい変数名のセットを持っています。最終的に変数名はgroup_byと一緒に使用されます。 、私は彼らがvarsを使用し、enquo、引用符で変数名を置くために様々な試みを試してみましたinvoke_mapを使用して変数名をargsとして渡す

library(dplyr) 
library(purrr) 
first_fun <- function(...){ 
    by_group = quos(...) 
    mtcars %>% 
    group_by(!!!by_group) %>% 
    count() 
} 

second_fun <- function(...){ 
    by_group = quos(...) 
    mtcars %>% 
    group_by(!!!by_group) %>% 
    summarise(avg_wt = mean(wt)) 
} 

first_fun(mpg, cyl) # works 
second_fun(mpg, cyl) # works 

both_funs <- list(first_fun, second_fun) 

both_funs %>% 
    invoke_map(mpg, cyl) # What do I do here? 

.data$mpgを参照するなど、私は暗闇の中でビットを刺しています:

は、ここでの例です。

+0

[この質問](https://stackoverflow.com/questions/43415475/how- to-parametrize-function-calls-in-dplyr-0-7/43416705#43416705)は、ドットの代わりに名前付きパラメータからグループ化カラムを得るために関数を変更することによって問題に対処する方法を示しています。私はまだinvokeを使って変数名をどのようにドットで渡すかという問題に興味がありますが、おそらく答えはドットから変数名を取得しないということです。 –

+0

'.env'引数はここでは便利だと思いますが、' invoke_map(first_fun、list(mpg、cyl))、.env = as.environment(mtcars)) 'も動作しません。 – Axeman

答えて

1

問題はあなたがドットを使用しているということではなく、名前を使用していて、map2_implが呼び出されたときに評価されます。

ことは、これを試してみて、環境を探る:

debugonce(map2) 
both_funs %>% invoke_map("mpg", "cyl") 

これは一方で動作します:

first_fun2 <- function(...){ 
    mtcars %>% 
    {do.call(group_by_,list(.,unlist(list(...))))} %>% 
    count() 
} 

second_fun2 <- function(...){ 
    mtcars %>% 
    {do.call(group_by_,list(.,unlist(list(...))))} %>% 
    summarise(avg_wt = mean(wt)) 
} 

both_funs2 <- list(first_fun2, second_fun2) 
both_funs2 %>% invoke_map("mpg", "cyl") 

# [[1]] 
# # A tibble: 25 x 2 
# # Groups: mpg [25] 
# mpg  n 
# <dbl> <int> 
# 1 10.4  2 
# 2 13.3  1 
# 3 14.3  1 
# 4 14.7  1 
# 5 15.0  1 
# 6 15.2  2 
# 7 15.5  1 
# 8 15.8  1 
# 9 16.4  1 
# 10 17.3  1 
# # ... with 15 more rows 
# 
# [[2]] 
# # A tibble: 25 x 2 
# mpg avg_wt 
# <dbl> <dbl> 
# 1 10.4 5.3370 
# 2 13.3 3.8400 
# 3 14.3 3.5700 
# 4 14.7 5.3450 
# 5 15.0 3.5700 
# 6 15.2 3.6075 
# 7 15.5 3.5200 
# 8 15.8 3.1700 
# 9 16.4 4.0700 
# 10 17.3 3.7300 
# # ... with 15 more rows 
+0

名前が評価されているという問題がある場合、 'enquo'ファミリの関数の1つを使用して評価を遅らせるべきではないでしょうか? –

+0

しかし、評価を遅らせたいだけではなく、評価したくありません。クラッシュする行は '.Call(map2_impl、environment()、.x"、 ".y"、 ".f"、 "list") 'です。限り、私はそれがCコードを呼び出し、パラメータを評価する文字列を列挙して理解して、私はあなたの名前付きパラメータがこれを通過する余地を参照してください。 –

+0

概念的な問題もあります。これらの名前付き変数は、現在のオブジェクトの既存のオブジェクトや列を参照するものではありません。 –

関連する問題