Из виньетки Программирование с помощью dplyr :
Большинство аргументов dplyr не являются ссылочно прозрачными. Это означает, что вы не можете заменить значение, казалось бы, эквивалентным объектом, который вы определили в другом месте.
Следовательно, вам необходимо передать имена столбцов без кавычек в функцию, так как тогда при enquo
среда захватывается должным образом, и !!
возвращает имена столбцов без кавычек, поскольку mutate
ожидает этого.
Чтобы превратить обычный mutate
-звук в функцию с нестандартной оценкой, было бы более интуитивно понятно, как это начинать.
Сначала запишите вызов, как без функции:
mtcars %>%
rownames_to_column("vehicle") %>%
select(vehicle, mpg, disp) %>%
mutate(correlation = cor(mpg, disp))
Это работает (и вызовет ошибку с кавычками mpg
и disp
!).
Теперь потяните переменные, которые вы хотите изменить перед вызовом и подставьте их:
col1 <- quo(mpg)
col2 <- quo(disp)
mtcars %>%
rownames_to_column("vehicle") %>%
select(vehicle, !!col1, !!col2) %>%
mutate(correlation=cor(!!col1, !!col2))
Поскольку это за пределами функции, мы должны использовать quo
здесь, но на последнем шаге, когда мы заключаем ее в функцию, мы используем enquo
.
myCor <- function(var1, var2) {
col1 <- enquo(var1)
col2 <- enquo(var2)
mtcars %>%
rownames_to_column("vehicle") %>%
select(vehicle, !!col1, !!col2) %>%
mutate(correlation=cor(!!col1, !!col2))
}
Я использовал разные имена для аргументов функции, а затем объект «заключенный в кавычки» (с enquo
), чтобы сделать различие более четким, но, конечно, оно работает и с col1
и col2
.