使用非标准评估在自定义 dplyr 函数中使用字符串作为参数

Using strings as arguments in custom dplyr function using non-standard evaluation

我正在尝试编写一个函数,该函数采用一个度量并使用 dplyr 函数和非标准评估计算与该度量的第一个值的相对差异。按照这些说明 (https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html),我想出了这个,效果很好:

testFun <- function(data, metric) {
  metric <- enquo(metric)
  metric_name <- quo_name(metric)
  data %>%
    mutate(!!metric_name := `-`(!!metric, first(!!metric)) / first(!!metric) * 
100)
}

testFun(data.frame(x = c("a", "b", "c"), y = 1:3), y)

但是,问题是在代码的其他地方我还有其他函数将指标名称作为存储在某个变量中的字符串,例如:

myVar <- "y"

我不想更改所有内容,但我仍想使用相同的变量。所以我的问题是,我可以让相同的功能与此调用一起使用吗?

testFun(data.frame(x = c("a", "b", "c"), y = 1:3), myVar)

通过更改函数中的某些内容或以某种方式调整调用中的输入。后者会更可取。我已经尝试了 myVar 的各种引用、取消引用、评估等,但我并不是很了解所有这些,也无法提出可行的解决方案。按照我的理解,我需要以某种方式从 myVar 获取 ~y。可以吗?

您可以使用 sym 将 "y" 转换为符号或 parse_expr 将其解析为表达式,然后使用 !!:[=18 取消引用=]

library(rlang)

testFun(data.frame(x = c("a", "b", "c"), y = 1:3), !!sym(myVar))

testFun(data.frame(x = c("a", "b", "c"), y = 1:3), !!parse_expr(myVar))

结果:

  x   y
1 a   0
2 b 100
3 c 200

查看我在 中的回答,了解 symparse_expr 之间的区别。