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

时间:2018-05-17 14:05:08

标签: r dplyr nse

我正在尝试编写一个函数,该函数采用度量并使用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得到。可以吗?

1 个答案:

答案 0 :(得分:2)

您可以使用sym来转动&#34; y&#34;使用符号或parse_expr将其解析为表达式,然后使用!!取消引用它:

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

this question中查看我的回答,了解symparse_expr之间差异的解释。