函数中的dplyr的mutate_each有效但match()找不到参数

jan*_*nyi 6 r dplyr

当试图解决这个问题,我遇到了一个问题mutate_eachdplyr.我想在函数中使用它并将参数传递给它.这是成功的,funs()但不是matches().

让我展示一个简单的例子,其中任务是附加一些标记一些变量的值.

library(dplyr) 
mydf <- data.frame(this_var1 = c("a", "b", "c", "d", "e"), 
                   this_var2 = c("b", "c", "d", "e", "f"),
                   that_var1 = c("x", "y", "z", "w", "u"))

mymutate1 <- function(data, tag) {
  data %>% mutate_each(funs(paste0(., tag)))
}

mymutate1(mydf, "_foo")
  this_var1 this_var2 that_var1
1     a_foo     b_foo     x_foo
2     b_foo     c_foo     y_foo
3     c_foo     d_foo     z_foo
4     d_foo     e_foo     w_foo
5     e_foo     f_foo     u_foo    
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力.但是,如果我尝试控制应该应用转换的变量,它也会失败.

mymutate2 <- function(data, tag, m) {
  data %>% mutate_each(funs(paste0(., tag)), matches(m))
}
mymutate2(mydf, "_foo", "this")
Run Code Online (Sandbox Code Playgroud)

这会出现以下错误:Error in is.string(match) : object 'm' not found.为什么tag找到而m不是?

代码本身按预期工作:

mydf %>% mutate_each(funs(paste0(., "_foo")), matches("this"))
  this_var1 this_var2 that_var1
1     a_foo     b_foo         x
2     b_foo     c_foo         y
3     c_foo     d_foo         z
4     d_foo     e_foo         w
5     e_foo     f_foo         u
Run Code Online (Sandbox Code Playgroud)

Jas*_*lns 6

您将要使用标准评估(SE)版本mutate_each- 即mutate_each_:

mymutate2 <- function(data, tag, m) {
  data %>% mutate_each_(funs(paste0(., tag)), ~matches(m))
}
Run Code Online (Sandbox Code Playgroud)

为了更加清晰,以下内容是等效的:

mymutate3 <- function(data, tag, m) {
  data %>% mutate_each_(~paste0(., tag), ~matches(m))
}
Run Code Online (Sandbox Code Playgroud)

根据小插图:

"最好使用公式[ ~而不是quote()或使用字符串""],因为公式会捕获要评估的表达式,以及应该评估它的环境......使用除公式之外的任何内容都会失败,因为它不会我不知道要看哪个环境."