dplyr:标准评估和enquo()
我听说dplyr中不推荐标准评估,我们可以对enquo和quo做类似的事情 我的原始代码是简化的dplyr:标准评估和enquo(),r,dplyr,tidyeval,R,Dplyr,Tidyeval,我听说dplyr中不推荐标准评估,我们可以对enquo和quo做类似的事情 我的原始代码是简化的 my_function <- function(data, x="OriginalX", y="OriginalY"){ data %>% mutate_(CopyX = x, CopyY = y) } 它是有效的 我尝试了以下代码 my_function <- function(data, x="OriginalX", y="OriginalY"){ qx &
my_function <- function(data, x="OriginalX", y="OriginalY"){
data %>%
mutate_(CopyX = x, CopyY = y)
}
它是有效的
我尝试了以下代码
my_function <- function(data, x="OriginalX", y="OriginalY"){
qx <- enquo(x)
qy <- enquo(y)
data %>%
mutate(CopyX = (!!qx), CopyY = (!!qy))
}
为什么它不起作用?我们应该继续使用标准评估吗?tidyeval背后的想法是,你不需要在两者之间加上你的列名。因此,这应该是可行的:
my_function <- function(data, x= OriginalX , y= OriginalY ){
qx <- enquo(x)
qy <- enquo(y)
data %>%
mutate(CopyX = !!qx,
CopyY = !!qy)
}
如果需要在函数参数中使用字符串,可以使用ensym函数转换它们:
my_function <- function(data, x= "OriginalX" , y= "OriginalY" ){
qx <- ensym(x)
qy <- ensym(y)
data %>%
mutate(CopyX = !!qx,
CopyY = !!qy)
}
my_function(iris, "Sepal.Length", "Species") %>%
head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species CopyX CopyY
1 5.1 3.5 1.4 0.2 setosa 5.1 setosa
2 4.9 3.0 1.4 0.2 setosa 4.9 setosa
3 4.7 3.2 1.3 0.2 setosa 4.7 setosa
4 4.6 3.1 1.5 0.2 setosa 4.6 setosa
5 5.0 3.6 1.4 0.2 setosa 5.0 setosa
6 5.4 3.9 1.7 0.4 setosa 5.4 setosa
tidyeval背后的想法是,您不需要将列名放在两者之间。因此,这应该是可行的:
my_function <- function(data, x= OriginalX , y= OriginalY ){
qx <- enquo(x)
qy <- enquo(y)
data %>%
mutate(CopyX = !!qx,
CopyY = !!qy)
}
如果需要在函数参数中使用字符串,可以使用ensym函数转换它们:
my_function <- function(data, x= "OriginalX" , y= "OriginalY" ){
qx <- ensym(x)
qy <- ensym(y)
data %>%
mutate(CopyX = !!qx,
CopyY = !!qy)
}
my_function(iris, "Sepal.Length", "Species") %>%
head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species CopyX CopyY
1 5.1 3.5 1.4 0.2 setosa 5.1 setosa
2 4.9 3.0 1.4 0.2 setosa 4.9 setosa
3 4.7 3.2 1.3 0.2 setosa 4.7 setosa
4 4.6 3.1 1.5 0.2 setosa 4.6 setosa
5 5.0 3.6 1.4 0.2 setosa 5.0 setosa
6 5.4 3.9 1.7 0.4 setosa 5.4 setosa
我认为OP是在传递信息。因此,可以将其转换为符号,而不是enquo@为什么我们需要使用akrun!!在这里这个符号代表什么?@akrun谢谢!我编辑了我的答案,也涵盖了这个案例。我认为OP是在传递信息。因此,可以将其转换为符号,而不是enquo@为什么我们需要使用akrun!!在这里这个符号代表什么?@akrun谢谢!我编辑了我的答案,也涵盖了这种情况。这是针对传递符号/名称而不是字符串的情况。tidyverse不喜欢键入引号。您可以使用qg enquo将字符串转换为符号,这适用于传递符号/名称而不是字符串的情况。tidyverse不喜欢键入引号。您可以使用qg将字符串转换为符号