我是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 = Min
,if(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() 的函数