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))
これはつまり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.Width
を2
に、Petal.Width
を4
に置き換えて、2:4
として評価される。このインデックスをもういちど列名に戻す。という感じ。
(注:これはdplyr 0.5での挙動なので、将来変わるかも)