読者です 読者をやめる 読者になる 読者になる

メモ:dplyr::mutate()に引数のリストを渡したいときは.dotでがんばるよりpurrr::invoke()

これはうまくいく。

common_params <- list(zero = 0, one = 1)

data.frame(x = seq(1, 10)) %>%
  mutate_(.dots = common_params)
#>     x zero one
#> 1   1    0   1
#> 2   2    0   1
#> 3   3    0   1
#> 4   4    0   1
#> 5   5    0   1
#> 6   6    0   1
#> 7   7    0   1
#> 8   8    0   1
#> 9   9    0   1
#> 10 10    0   1

でもこれは、数値の場合は0という表現式が評価されると数値の0になるからたまたまうまくいっているだけで、文字列だとうまくいかない。

common_params <- list(zero = "ゼロ", one = "イチ")

data.frame(x = seq(1, 10)) %>%
  mutate_(.dots = common_params)
#> Error: binding not found: 'ゼロ'

こういうときは、素直にdo.call()とかinvoke()とかすればいい。

data.frame(x = seq(1, 10)) %>%
  invoke(.f = mutate, .x = common_params, .data = .)
#>     x zero  one
#> 1   1 ゼロ イチ
#> 2   2 ゼロ イチ
#> 3   3 ゼロ イチ
#> 4   4 ゼロ イチ
#> 5   5 ゼロ イチ
#> 6   6 ゼロ イチ
#> 7   7 ゼロ イチ
#> 8   8 ゼロ イチ
#> 9   9 ゼロ イチ
#> 10 10 ゼロ イチ

別にわざわざdplyrとかpurrrとか無理して使う必要ない気もするけど。