【问题标题】:Using strings as arguments in custom dplyr function using non-standard evaluation在使用非标准评估的自定义 dplyr 函数中使用字符串作为参数
【发布时间】:2018-10-27 20:15:19
【问题描述】:

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

【问题讨论】:

    标签: r dplyr nse


    【解决方案1】:

    您可以使用sym 将“y”转换为符号或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 之间的区别。

    【讨论】:

    • 太棒了,这就是工作!非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2021-05-08
    • 2018-08-01
    相关资源
    最近更新 更多