Укажите аргумент точек при вызове функции, использующей 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))
}
Это работает: foo(mtcars, cyl)
Но моя фактическая функция имеет больше предшествующих аргументов перед ...
аргумент, все со значениями по умолчанию. Утомительно набирать их все в тех случаях, когда я вызываю свою функцию с этими значениями по умолчанию и передаю значение в...
.
Это то, что я хочу - предположить dat = mtcars
- Но это не работает:
foo(... = cyl)
Ошибка: имена не должны иметь форму
...
или..j
.
Могу ли я изменить функцию или вызов, чтобы разрешить прямую спецификацию ...
?
1 ответ
Как правило, рекомендуется ™ ставить аргументы со значениями по умолчанию после точек:
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