【问题标题】:Dplyr function with optional default argument and required ellipiss具有可选默认参数和必需省略号的 Dplyr 函数
【发布时间】:2026-01-04 14:10:01
【问题描述】:

我有一个简单的函数,可以为变量的唯一组合添加计数:

功能

# 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

【问题讨论】:

  • 只需更改参数的顺序add_tally &lt;- function(df, ..., n = "n")
  • @JulienNavarre 正确,如果你想让它成为答案,我很乐意接受。
  • @akrun TBH,这个功能背后的实际原因并不多。我想更好地利用 quosures 和 rlang 这样的东西,很多东西在那里毫无意义,比如 none &lt;- Negate(any)
  • this相关
  • @akrun 非常感谢您提供的信息链接。

标签: r function dplyr ellipsis rlang


【解决方案1】:

您需要更改参数的顺序,以便您提供的第二个参数在未命名时不会被解释为 n 值。

add_tally <- function(df, ..., n = "n") {
 #function code
}

【讨论】:

    最近更新 更多