我刚开始使用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'的列
我该如何解决?感谢您的帮助,对不起,英语不好
答案 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