dplyr的可选参数编​​程

时间:2019-06-24 12:38:02

标签: r dplyr

我刚开始使用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留空,则会收到错误消息:

  

错误:无法在位置1处布置类'NULL'的列

我该如何解决?感谢您的帮助,对不起,英语不好

1 个答案:

答案 0 :(得分:0)

sort <- enquo(sort)移动到else部分可以使您更近一些,但是您仍然会遇到问题,因为如果在函数中使用if(is.null(sort)),则sort = Min行将返回错误,因为{{ 1}}将要评估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))
  }

}

请参见Testing a function that uses enquo() for a NULL parameter