Цель
Моя цель - определить некоторые функции для использования в глаголах dplyr
, которые используют предопределенные переменные. Это потому, что у меня есть некоторые из этих функций, которые берут кучу аргументов, из которых многие всегда являются одинаковыми именами переменных.
Мое понимание: Это сложно (и, возможно, невозможно), потому что dplyr
будет лениво оценивать указанные пользователем переменные позже, но любые аргументы по умолчанию не входят в вызов функции и поэтому невидимы для dplyr
.
Пример игрушки
Рассмотрим следующий пример, в котором я использую dplyr
для вычисления того, изменилась ли переменная или нет (в данном случае это довольно бессмысленно):
library(dplyr)
mtcars %>%
mutate(cyl_change = cyl != lag(cyl))
Теперь lag
также поддерживает альтернативное упорядочение следующим образом:
mtcars %>%
mutate(cyl_change = cyl != lag(cyl, order_by = gear))
Но что, если я хотел бы создать свою собственную версию lag
, которая всегда заказывает gear
?
Неудачные попытки
Наивный подход заключается в следующем:
lag2 <- function(x, n = 1L, order_by = gear) lag(x, n = n, order_by = order_by)
mtcars %>%
mutate(cyl_change = cyl != lag2(cyl))
Но это, очевидно, вызывает ошибку:
не найден объект с именем 'gear
Более реалистичные варианты были бы такими, но они также не работают:
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = ~gear)
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = get(gear))
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = getAnywhere(gear))
lag2 <- function(x, n = 1L) lag(x, n = n, order_by = lazyeval::lazy(gear))
Вопрос
Есть ли способ получить lag2
, чтобы правильно найти gear
в файле data.frame, который dplyr
работает на?
- Вы должны иметь возможность вызывать
lag2
без предоставленияgear
. - Можно использовать
lag2
в наборах данных, которые не называютсяmtcars
(но имеютgear
как переменные). - Предпочтительно
gear
будет аргументом по умолчанию для функции, поэтому его можно по-прежнему изменять, если это необходимо, но это не имеет решающего значения.