У меня есть функция fun_1
, которая использует substitute()
в качестве аргумента ...
, и еще одна функция fun_2
с сигнатурой fun_2(...)
, реализующая шаблон do.call(fun_1, dots)
. Я хочу, чтобы fun_1()
внутри fun_2()
видел ...
, переданный fun_2()
. Вот иллюстрация того, что я пытаюсь сделать.
fun_1 <- function(...) {
substitute(list(...))[-1] %>%
sapply(deparse)
}
foo <- "X"
bar <- "Y"
fun_1(foo, bar)
# [1] "foo" "bar"
fun_2 <- function(...) {
# dots <- Filter(length, ???)
# rlang::invoke(my_fun, dots)
}
fun_2(foo, bar, NULL)
# desired output:
# [1] "foo" "bar"
Я думаю, что в rlang
достаточно волшебства, чтобы заставить это работать, но я не могу понять, как это сделать. Я согласен с изменением fun_1
до тех пор, пока
fun_1()
имеет доступ к значениямfoo
иbar
- Паттерн
do.call
реализован вfun_2()
РЕДАКТИРОВАТЬ: мне также нужно fun_2(list(foo, bar, NULL))
для работы
NULL
только тогда, когда он явно передан? или вы хотите отфильтроватьfoo
, еслиis.null(foo)
? - person Adam Spannbauer   schedule 05.05.2017exprs()
,quos()
,dots_list()
илиdots_splice()
в зависимости от того, что вам нужно, а затем перенаправьте их с помощью!!!
. - person Lionel Henry   schedule 09.05.2017