Использование строк в качестве аргументов в пользовательской функции dplyr с использованием нестандартной оценки - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь написать функцию, которая принимает метрику и вычисляет относительную разницу от первого значения этой метрики с помощью функций dplyr и нестандартной оценки. Следуя этим инструкциям (https://cran.r -project.org / web / packages / dplyr / vignettes / program.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 голосов
/ 17 мая 2018

Вы можете использовать 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.

...