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"的列

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

sort <- enquo(sort)移动到 else 部分可以让你更接近,但你仍然会遇到问题,因为如果你在函数中使用sort = Minif(is.null(sort))行将返回错误,因为is.null想要计算Min对象,但找不到它。

你可以使用missing来代替is.null,它不计算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

请参阅测试对 NULL 参数使用 enquo() 的函数

最新更新