r - 将具有 NULL 值的命名参数列表传递给函数
问题描述
我正在编写一个包装函数,dplyr::summarize
用于将摘要行添加到数据框中。目标是提供数据框、要汇总的列、汇总函数以及该函数的任何其他参数。目前,只要args
不是,该功能就可以工作NULL
。如果没有提供其他参数,则函数失败。
通过更改~do.call(.f, c(.x, args))
为~do.call(.f, list(.x, args))
,该函数在args
is时起作用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 日创建
解决方案
如果您使用,则应该找到它,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)))
)
}
推荐阅读
- jquery - jsTree:AJAX 调用后刷新内容然后打开所有
- sql-server - 在 Oracle SQL 中重写 SQL-Server 中的触发器
- angular7 - 组件中的角度反应式表单组清除错误未从模板中清除
- mysql - sql数据库中的条件
- ios - 是否可以使用 Xcode 使游戏控制器振动?
- android - 是否可以在开始下载之前获得动态功能模块大小?
- java - Java中静态内部类的私有构造函数
- javascript - 如何关闭除打开的 div 之外的所有 div?
- python - 将两个原始值转换为 32 位 IEEE 浮点数
- javascript - 为什么我的滑块在到达终点后变为空白?