具有可选默认参数和必需省略号的 Dplyr 函数
Dplyr function with optional default argument and required ellipiss
我有一个简单的函数,可以为变量的唯一组合添加计数:
函数
# Add tally summary for group
add_tally <- function(df, n = "n", ...) {
# Grpup variables
group_vars <- rlang::quos(...)
# Check if ellipsis is empty
if (length(group_vars) == 0) {
stop("Missing grouping variables")
}
none <- Negate(any)
# Check that passed object is data frame or tibble
if (none(tibble::is_tibble(df), is.data.frame(df))) {
stop("Passed object should be a data frame or tibble.")
}
if (hasArg("n")) {
# Take varname
varname <- n
} else {
varname <- "n"
}
df %>%
group_by(!!!group_vars, add = TRUE) %>%
mutate(!!varname := sum(n())) %>%
ungroup()
}
例子
相当简单:
>> mtcars[,c("am", "gear")] %>% add_tally(n = "my_n", am,gear)
# A tibble: 32 x 3
am gear my_n
<dbl> <dbl> <int>
1 1.00 4.00 8
2 1.00 4.00 8
3 1.00 4.00 8
4 0 3.00 15
5 0 3.00 15
6 0 3.00 15
7 0 3.00 15
8 0 4.00 4
9 0 4.00 4
10 0 4.00 4
问题
我希望 n
参数是可选的。 IE。如果未明确定义 (如上例中的 my_n
), 我希望参数采用默认值 n
值。由于 n = "n"
、 通常会发生这种情况,现在由于尝试 hasArgs()
调用而变得多余。
例子
这失败了:
>> mtcars[,c("am", "gear")] %>% add_tally(am,gear)
Error in add_tally(., am, gear) : object 'am' not found
想要的结果
# A tibble: 32 x 3
am gear n
<dbl> <dbl> <int>
1 1.00 4.00 8
2 1.00 4.00 8
3 1.00 4.00 8
4 0 3.00 15
5 0 3.00 15
6 0 3.00 15
7 0 3.00 15
8 0 4.00 4
9 0 4.00 4
10 0 4.00 4
您需要更改参数的顺序,以便您提供的第二个参数在未命名的情况下不会被解释为 n
值。
add_tally <- function(df, ..., n = "n") {
#function code
}
我有一个简单的函数,可以为变量的唯一组合添加计数:
函数
# Add tally summary for group
add_tally <- function(df, n = "n", ...) {
# Grpup variables
group_vars <- rlang::quos(...)
# Check if ellipsis is empty
if (length(group_vars) == 0) {
stop("Missing grouping variables")
}
none <- Negate(any)
# Check that passed object is data frame or tibble
if (none(tibble::is_tibble(df), is.data.frame(df))) {
stop("Passed object should be a data frame or tibble.")
}
if (hasArg("n")) {
# Take varname
varname <- n
} else {
varname <- "n"
}
df %>%
group_by(!!!group_vars, add = TRUE) %>%
mutate(!!varname := sum(n())) %>%
ungroup()
}
例子
相当简单:
>> mtcars[,c("am", "gear")] %>% add_tally(n = "my_n", am,gear)
# A tibble: 32 x 3
am gear my_n
<dbl> <dbl> <int>
1 1.00 4.00 8
2 1.00 4.00 8
3 1.00 4.00 8
4 0 3.00 15
5 0 3.00 15
6 0 3.00 15
7 0 3.00 15
8 0 4.00 4
9 0 4.00 4
10 0 4.00 4
问题
我希望 n
参数是可选的。 IE。如果未明确定义 (如上例中的 my_n
), 我希望参数采用默认值 n
值。由于 n = "n"
、 通常会发生这种情况,现在由于尝试 hasArgs()
调用而变得多余。
例子
这失败了:
>> mtcars[,c("am", "gear")] %>% add_tally(am,gear)
Error in add_tally(., am, gear) : object 'am' not found
想要的结果
# A tibble: 32 x 3
am gear n
<dbl> <dbl> <int>
1 1.00 4.00 8
2 1.00 4.00 8
3 1.00 4.00 8
4 0 3.00 15
5 0 3.00 15
6 0 3.00 15
7 0 3.00 15
8 0 4.00 4
9 0 4.00 4
10 0 4.00 4
您需要更改参数的顺序,以便您提供的第二个参数在未命名的情况下不会被解释为 n
值。
add_tally <- function(df, ..., n = "n") {
#function code
}