【问题标题】:dplyr: Standard evaluation and enquo()dplyr:标准评估和 enquo()
【发布时间】:2018-07-11 04:36:32
【问题描述】:

我听说 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 <- enquo(x)
  qy <- enquo(y)
  data %>%
     mutate(CopyX = (!!qx), CopyY = (!!qy))
}

为什么它不起作用?我们应该继续使用标准评估吗?

【问题讨论】:

  • enquo() 适用于传递符号/名称而不是字符串的情况。 (tidyverse 不喜欢输入引号。)您可以使用qg &lt;- rlang::sym(x) 而不是enquo(x) 将字符串转换为符号。而你要不要使用标准评估真的是见仁见智。不鼓励在 Stack Overflow 上提出受制于意见的问题。

标签: r dplyr tidyeval


【解决方案1】:

tidyeval 背后的想法是,您不需要将列名放在"" 之间。所以这应该有效:

my_function <- function(data, x= OriginalX , y= OriginalY ){
  qx <- enquo(x)
  qy <- enquo(y)
  data %>%
    mutate(CopyX = !!qx,
           CopyY = !!qy)
}

请注意,!!qx!!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

如果需要在函数参数中使用字符串,可以使用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 谢谢!我已经编辑了我的答案以涵盖这个案例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2017-10-27
  • 2020-09-17
  • 2015-03-23
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多