首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用tidyselect-使用函数时指定dots参数,而不需要指定前面的参数

在调用tidyselect-使用函数时指定dots参数,而不需要指定前面的参数
EN

Stack Overflow用户
提问于 2020-03-19 15:26:08
回答 1查看 242关注 0票数 6

下面是我在包中使用...参数和tidyselect来选择变量的函数的简化版本:

代码语言:javascript
复制
# this toy function just selects the ... variables
foo <- function(dat = mtcars, ...){
  expr <- rlang::expr(c(...))
  cols_to_select <- tidyselect::eval_select(expr, data = dat)
  dplyr::select(dat, all_of(cols_to_select))
}

这工作:foo(mtcars, cyl)

但我的实际函数在...参数之前有更多前面的参数,所有参数都带有默认值。在我用这些默认值调用函数并将一个值传递给...的情况下,输入它们都很繁琐。

这就是我想要的--假设是dat = mtcars --但它不起作用:

foo(... = cyl)

错误:名称不能以.....j的形式出现。

我是否可以修改函数或调用以允许...的直接规范?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-20 19:56:30

通常情况下,™在圆点之后放置带有默认值的参数是个好主意:

代码语言:javascript
复制
f <- function( ..., dat=mtcars )
    dplyr::select( dat, ... )

f(cyl)                 # Works
f(dat=iris, Species)   # Also works

如果您的API不允许您在点之后放置命名的默认参数,那么还有另一种选择。请注意,您不必显式地指定带有默认值的命名参数。你可以简单地让他们“失踪”:

代码语言:javascript
复制
foo(, cyl)    # Same as foo( dat=mtcars, cyl )

如果您有很多默认参数,并且您不想在调用中继续放置一堆逗号,那么可以使用purrr::partial()将这个模式捕获到一个独立的函数中:

代码语言:javascript
复制
foo2 <- purrr::partial(foo, ,)  # Effectively partial(foo, dat=mtcars)
foo2(cyl)                       # Works

如果还需要输入比您喜欢的逗号更多的逗号,则可以再添加一个步骤:

代码语言:javascript
复制
foo3 <- purrr::partial( foo, !!!purrr::keep(formals(foo), nzchar) )
foo3(cyl, mpg)                  # Also works
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60760245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档