【发布时间】:2023-08-25 08:31:02
【问题描述】:
我有一个函数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明确通过时过滤掉它?或者如果is.null(foo),你想过滤掉foo? -
@AdamSpannbauer 后者
-
我不确定我是否能帮助你,因为我不明白你想要达到什么目的。如果您想在某些操作后转发点,只需根据您的需要使用
exprs()、quos()、dots_list()或dots_splice()在两个函数中取点,然后使用!!!转发它们。 -
@lionel 是的,这正是我所需要的!在我进行 RTFM 之后,事情变得更有意义了……出于某种原因,我直到几天前才找到 tidyeval 小插图。