gpt4 book ai didi

r - 调用 tidyselect-using 函数时指定 dots 参数,无需指定前面的参数

转载 作者:行者123 更新时间:2023-12-03 21:15:48 25 4
gpt4 key购买 nike

这是我在使用 ... 的包中的函数的简化版本。参数和 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)

Error: Names must not be of the form ... or ..j.



我可以修改函数或调用以允许直接指定 ... ?

最佳答案

在点之后放置带有默认值的参数通常是一个好主意™:

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 works

关于r - 调用 tidyselect-using 函数时指定 dots 参数,无需指定前面的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60760245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com