Я пытаюсь разобраться с новыми реализациями в dplyr
в отношении программирования и нестандартной оценки. Таким образом, функции глагола_ заменяются на enquo
аргумента, а затем применяются !!
в обычной функции глагола. Преобразование select
из старого в новое работает нормально, следующая функция дает аналогичные результаты:
select_old <- function(x, ...) {
vars <- as.character(match.call())[-(1:2)]
x %>% select(vars)
}
select_new <- function(x, ...) {
vars <- as.character(match.call())[-(1:2)]
vars_enq <- enquo(vars)
x %>% select(!!vars_enq)
}
Однако, когда я пытаюсь использовать arrange
в новом стиле программирования, я получаю сообщение об ошибке:
arrange_old <- function(x, ...) {
vars <- as.character(match.call())[-(1:2)]
x %>% arrange_(vars)
}
arrange_new <- function(x, ...){
vars <- as.character(match.call())[-(1:2)]
vars_enq <- enquo(vars)
x %>% arrange(!!vars_enq)
}
mtcars %>% arrange_new(cyl)
# Error in arrange_impl(.data, dots) :
# incorrect size (1) at position 1, expecting : 32
32, очевидно, является количеством строк mtcars
, внутренняя функция dplyr
, по-видимому, ожидает вектор такой длины. Мои вопросы: почему новый стиль программирования не транслирует для arrange
и как это сделать тогда в новом стиле.