2017-10-30 5 views
1

私はdplyrを使っていくつかのプログラミングをしていますが、mapplyに式を(具体的にはMoreArgs)引数として渡す方法が不思議ですか?`mapply`の` MoreArgs`に式を渡す

いくつかidstime_rangeに基づいdata.frameをサブセット単純な関数Fを検討し、次にいくつかの他の列xに基づいて要約統計量を出力します。

require(dplyr) 
F <- function(ids, time_range, df, date_column, x) { 
    date_column <- enquo(date_column) 
    x <- enquo(x) 
    df %>% 
     filter(person_id %chin% ids) %>% 
     filter(time_range[1] <= (!!date_column) & (!!date_column) <= time_range[2]) %>% 
     summarise(newvar = sum(!!x)) 
} 

私たちは、関数Fを適用できるいくつかのサンプルデータを作り上げることができます。

person_ids <- lapply(1:2, function(i) sample(letters, size = 10)) 
time_ranges <- lapply(list(c("2014-01-01", "2014-12-31"), 
          c("2015-01-01", "2015-12-31")), as.Date) 

require(data.table) 
dt <- CJ(person_id = letters, 
     date_col = seq.Date(from = as.Date('2014-01-01'), to = as.Date('2015-12-31'), by = '1 day')) 
dt[, z := rnorm(nrow(dt))] # The variable we will later sum over, i.e. apply F to. 

私たちは正常に私たちの入力をそれぞれの入力に適用することができます。

F(person_ids[[1]], time_ranges[[1]], dt, date_col, z) 
F(person_ids[[2]], time_ranges[[2]], dt, date_col, z) 

だから私が望むなら、簡単なループを書くことで問題を解決できます。しかし、文法的な砂糖を適用してすべてをmapplyにラップしようとすると、エラーが発生します。 mapply

mapply(F, ids = person_ids, time_range = time_ranges, MoreArgs = list(df = dt, date_column = date_col, x = z)) 

# Error in mapply... object 'date_col' not found 
+2

これを 'quote'または' enquo'することはできますか?pmapを使用してください。これは非標準的な評価についてのことです。プログラムするのは難しいです。それを行うための 'dplyr'方法は、あなたの' mapply'で呼び出すのにふさわしい標準評価 'F_'を持つことです。 – Gregor

答えて

3

MoreArgsリストとして提供するが、Rは、エラーを引き起こし、リスト要素を評価しようとしています。 @Gregorの示唆したように、 MoreArgsはすぐに評価したくないので、エラーを防ぎ、機能を続行させることができます。これは、ベースquote又はdplyrquoで行うことができる。

mapply(F, person_ids, time_ranges, MoreArgs = list(dt, quote(date_col), quote(z))) 

mapply(F, person_ids, time_ranges, MoreArgs = list(dt, quo(date_col), quo(z))) 

別のオプションは、2つの入力ベクトルとmapplytidyverse等価であるpurrrパッケージからmap2を使用することです。あなたは可能性が、より一般的に

library(purrr) 

map2(person_ids, time_ranges, F, dt, date_col, z) 
[[1]] 
    newvar 
1 40.23419 

[[2]] 
    newvar 
1 71.42327 

tidyverse機能は、引数を引用するためにあなたが必要とすることなく、mapplyで取得しているエラーを回避し、非標準の評価、で動作するように設定されています

関連する問題