Программирование необязательного аргумента с помощью dplyr - PullRequest
0 голосов
/ 24 июня 2019

Я новичок в программировании с dplyr. Допустим, у меня есть такая функция:

example <- function(data, group, var){

  group <- enquo(group)
  var <- enquo(var)

  data %>% 
    group_by(!! group) %>% 
    summarise(
      Min = min(!! var),
      Max = max(!! var)
    )  
} 

> diamonds %>% example(cut, price)
# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Good        327 18788
3 Very Good   336 18818
4 Premium     326 18823
5 Ideal       326 18806

Я хотел бы добавить новый аргумент sort. Если не указано, функция больше ничего не делает, если указано, функция делает arrange(desc(sort)).

Я пробовал такие вещи:

example <- function(data, group, var, sort = NULL){

  sort <- enquo(sort)
  group <- enquo(group)
  var <- enquo(var)

  data <- 
    data %>% 
    group_by(!! group) %>% 
    summarise(
      Min = min(!! var),
      Max = max(!! var)
    )

  if(is.null(sort)) data
  else arrange(data, desc(!! sort))

}

Работает, если указан аргумент sort

> diamonds %>% example(cut, price, sort = Min)
# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Very Good   336 18818
3 Good        327 18788
4 Premium     326 18823
5 Ideal       326 18806

Но если я оставляю sort пустым, я получаю сообщение об ошибке:

Ошибка: невозможно расположить столбец класса 'NULL' в позиции 1

Как я могу это исправить? Спасибо за помощь и извините за плохой английский

1 Ответ

0 голосов
/ 24 июня 2019

Перемещение sort <- enquo(sort) в секцию else делает вас ближе, но у вас все равно будет проблема, потому что строка if(is.null(sort)) вернет ошибку, если вы используете sort = Min в функции, потому что is.null захочет оценитьMin объект, но не найдет его.

Вместо использования is.null вы можете использовать missing, который не оценивает объект Min.

example <- function(data, group, var, sort = NULL){

  group <- enquo(group)
  var <- enquo(var)

  data <- 
    data %>% 
    group_by(!! group) %>% 
    summarise(
      Min = min(!! var),
      Max = max(!! var)
    )

  if(missing(sort)) {
    data
  } else { sort <- enquo(sort)
  arrange(data, desc(!! sort))
  }

}

Теперь мы получаем следующие выходные данные:

diamonds %>% example(cut, price)

# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Good        327 18788
3 Very Good   336 18818
4 Premium     326 18823
5 Ideal       326 18806

diamonds %>% example(cut, price, sort = Min)

# A tibble: 5 x 3
  cut         Min   Max
  <ord>     <dbl> <dbl>
1 Fair        337 18574
2 Very Good   336 18818
3 Good        327 18788
4 Premium     326 18823
5 Ideal       326 18806

См. Тестирование функции, которая использует enquo () для параметра NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...