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

メモ:dplyrのselect(data, col1:colN)みたいなやつはどう実現しているのか

R dplyr

select()は内部的にはselect_vars()を使っている。select_vars()はさらに内部ではlazyeval::lazy_eval()を呼び出している。

  names_list <- setNames(as.list(seq_along(vars)), vars)

  ...略...

  ind_list <- c(initial_case, lazyeval::lazy_eval(args, names_list))

(https://github.com/hadley/dplyr/blob/8430adca4cc6488689fc08b0f8a40a88371fba2a/R/select-vars.R#L66-L71)

これはつまりirisでやるとこんな感じ。

vars <- names(iris)
names_list <- setNames(as.list(seq_along(vars)), vars)
names_list
#> $Sepal.Length
#> [1] 1
#> 
#> $Sepal.Width
#> [1] 2
#> 
#> $Petal.Length
#> [1] 3
#> 
#> $Petal.Width
#> [1] 4
#> 
#> $Species
#> [1] 5

lazyeval::lazy_eval("Sepal.Width:Petal.Width", names_list)
#> [1] 2 3 4

つまり、"Sepal.Width:Petal.Width"Sepal.Width2に、Petal.Width4に置き換えて、2:4として評価される。このインデックスをもういちど列名に戻す。という感じ。

(注:これはdplyr 0.5での挙動なので、将来変わるかも)