Использование строк в качестве аргументов в пользовательской функции dplyr с использованием нестандартной оценки

Я пытаюсь написать функцию, которая принимает метрику и вычисляет относительную разницу от первого значения этой метрики с функциями 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, но я не очень хорошо все это понимаю и не мог найти рабочего решения. Как я понимаю, мне как-то нужно получить ~ y от myVar. Это можно сделать?


person M4RT1NK4    schedule 17.05.2018    source источник


Ответы (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

Проверьте мой ответ в этот вопрос для объяснения разницы между sym и parse_expr.

person acylam    schedule 17.05.2018
comment
Удивительно, это делает свою работу! Огромное спасибо! :) - person M4RT1NK4; 17.05.2018