当试图解决这个问题,我遇到了一个问题mutate_each
的dplyr
.我想在函数中使用它并将参数传递给它.这是成功的,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)
您将要使用标准评估(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()
或使用字符串""
],因为公式会捕获要评估的表达式,以及应该评估它的环境......使用除公式之外的任何内容都会失败,因为它不会我不知道要看哪个环境."