Sam*_*rke 6 r rlang tidyselect
这是我在包中使用...参数并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))
}
Run Code Online (Sandbox Code Playgroud)
这有效: foo(mtcars, cyl)
但是我的实际函数在参数之前有更多前面的...参数,所有参数都有默认值。如果我使用这些默认值调用我的函数并将值传递给....
这就是我想要的 - 假设dat = mtcars- 但它不起作用:
foo(... = cyl)
错误:名称不得采用
...或形式..j。
我可以修改函数或调用以允许直接指定...吗?
在点之后放置带有默认值的参数通常是一个好主意™ :
f <- function( ..., dat=mtcars )
dplyr::select( dat, ... )
f(cyl) # Works
f(dat=iris, Species) # Also works
Run Code Online (Sandbox Code Playgroud)
如果您的 API 不允许您在点之后放置命名的默认参数,这里有另一种选择。请注意,您不必显式指定具有默认值的命名参数。您可以简单地让它们“丢失”:
foo(, cyl) # Same as foo( dat=mtcars, cyl )
Run Code Online (Sandbox Code Playgroud)
如果您有很多默认参数,并且不想在调用中继续放置一堆逗号,则可以使用purrr::partial()将此模式捕获到独立函数中:
foo2 <- purrr::partial(foo, ,) # Effectively partial(foo, dat=mtcars)
foo2(cyl) # Works
Run Code Online (Sandbox Code Playgroud)
如果仍然需要输入比您喜欢的更多的逗号,您可以再添加一个步骤:
foo3 <- purrr::partial( foo, !!!purrr::keep(formals(foo), nzchar) )
foo3(cyl, mpg) # Also works
Run Code Online (Sandbox Code Playgroud)