下面是我在包中使用...参数和tidyselect来选择变量的函数的简化版本:
# 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的形式出现。
我是否可以修改函数或调用以允许...的直接规范?
发布于 2020-03-20 19:56:30
通常情况下,™在圆点之后放置带有默认值的参数是个好主意:
f <- function( ..., dat=mtcars )
dplyr::select( dat, ... )
f(cyl) # Works
f(dat=iris, Species) # Also works如果您的API不允许您在点之后放置命名的默认参数,那么还有另一种选择。请注意,您不必显式地指定带有默认值的命名参数。你可以简单地让他们“失踪”:
foo(, cyl) # Same as foo( dat=mtcars, cyl )如果您有很多默认参数,并且您不想在调用中继续放置一堆逗号,那么可以使用purrr::partial()将这个模式捕获到一个独立的函数中:
foo2 <- purrr::partial(foo, ,) # Effectively partial(foo, dat=mtcars)
foo2(cyl) # Works如果还需要输入比您喜欢的逗号更多的逗号,则可以再添加一个步骤:
foo3 <- purrr::partial( foo, !!!purrr::keep(formals(foo), nzchar) )
foo3(cyl, mpg) # Also workshttps://stackoverflow.com/questions/60760245
复制相似问题