使用mutate_each_控制dplyr评估范围

Bro*_*ieG 3 r dplyr

有没有办法确保mutate_each_(或者可能funs_)在父框架中查找函数?考虑:

library(dplyr)    # 0.4.1
library(magrittr) # 1.5

fun_list <- list(a=quote(rev), b=quote(sort))
iris[1:5, 1:2] %>% mutate_each_(funs_(fun_list), c("Sepal.Length"))
Run Code Online (Sandbox Code Playgroud)

像你期望的那样工作:

  Sepal.Length Sepal.Width   a   b
1          5.1         3.5 5.0 4.6
2          4.9         3.0 4.6 4.7
3          4.7         3.2 4.7 4.9
4          4.6         3.1 4.9 5.0
5          5.0         3.6 5.1 5.1
Run Code Online (Sandbox Code Playgroud)

但:

my_rev <- rev
my_srt <- sort
fun_list2 <- list(a=quote(my_rev), b=quote(my_srt))
iris[1:5, 1:2] %>% mutate_each_(funs_(fun_list2), c("Sepal.Length"))
Run Code Online (Sandbox Code Playgroud)

错误:

Error in mutate_impl(.data, dots) : could not find function "my_rev"
Run Code Online (Sandbox Code Playgroud)

一个简单的mutate作品:

iris[1:5, 1:2] %>% mutate(a=my_rev(Sepal.Length), b=my_srt(Sepal.Length))
Run Code Online (Sandbox Code Playgroud)

Ste*_*pré 6

您应该在~此处使用公式表示法而不是quote()

my_rev <- rev
my_srt <- sort
fun_list2 <- list(a = ~my_rev, b = ~my_srt)
iris[1:5, 1:2] %>% mutate_each_(funs_(fun_list2), c("Sepal.Length"))
Run Code Online (Sandbox Code Playgroud)

从非标准评估小插图:

最好使用公式,因为公式会捕获要评估的表达式以及应该评估它的环境.