首页 > 解决方案 > 将具有 NULL 值的命名参数列表传递给函数

问题描述

我正在编写一个包装函数,dplyr::summarize用于将摘要行添加到数据框中。目标是提供数据框、要汇总的列、汇总函数以及该函数的任何其他参数。目前,只要args不是,该功能就可以工作NULL。如果没有提供其他参数,则函数失败。

通过更改~do.call(.f, c(.x, args))~do.call(.f, list(.x, args)),该函数在argsis时起作用NULL,但在args提供时失败(由于嵌套列表,如此所述)。

有没有办法定义函数,以便无论是否args提供它都可以工作?

library(tidyverse)

set.seed(1234)
dat <- tibble(group = sample(letters, 10),
              var1 = c(rnorm(9), NA),
              var2 = rnorm(10))

my_func <- function(df, ..., .f = sum, args = NULL) {
  df %>%
    dplyr::bind_rows(
      dplyr::summarize_at(., dplyr::vars(...), ~do.call(.f, c(.x, args)))
    )
}

my_func(dat, var1, var2, .f = sum, args = list(na.rm = TRUE))
#> # A tibble: 11 x 3
#>    group    var1   var2
#>    <chr>   <dbl>  <dbl>
#>  1 p     -0.575  -0.110
#>  2 v     -0.547  -0.511
#>  3 e     -0.564  -0.911
#>  4 l     -0.890  -0.837
#>  5 o     -0.477   2.42 
#>  6 i     -0.998   0.134
#>  7 x     -0.776  -0.491
#>  8 f      0.0645 -0.441
#>  9 z      0.959   0.460
#> 10 d     NA      -0.694
#> 11 <NA>  -3.80   -0.985


my_func(dat, var1, var2, .f = sum)
#> Error: `summarise()` argument `var1` errored.
#> ℹ `var1` is `(structure(function (..., .x = ..1, .y = ..2, . = ..1) ...`.
#> x second argument must be a list

reprex 包(v0.3.0)于 2020 年 2 月 28 日创建

标签: rdplyr

解决方案


如果您使用,则应该找到它,c()但请确保您的第一个参数是一个列表

my_func <- function(df, ..., .f = sum, args = NULL) {
  df %>%
    dplyr::bind_rows(
      dplyr::summarize_at(., dplyr::vars(...), ~do.call(.f, c(list(.x), args)))
    )
}

推荐阅读