R:捕获函数调用的预定参数

时间:2018-10-01 21:03:23

标签: r metaprogramming rlang

我需要捕获函数调用的预先指定的参数。对于未指定的rlang::list2(...)来说,这似乎很容易,但是对于指定的对象(在函数的形式中定义的“指定的”含义)来说,难度更大。

我已经尝试过base::match.callhttps://rlang.r-lib.org/reference/index.html#section-calls中的功能,但是还没有成功。

library(rlang)

capture_dots <- function(..., arg1) {
  list2(...)
}

capture_dots("abc", arg1 = 1, arg2 = 2)
#> [[1]]
#> [1] "abc"
#> 
#> $arg2
#> [1] 2

所需的输出

capture_prespecified("abc", arg1 = 1, arg2 = 2)
#> $arg1
#> [1] 1

1 个答案:

答案 0 :(得分:2)

如果要捕获函数的所有命名参数,则可以使用formals()来获取它们的名称(并过滤掉“ ...”)

capture_dots <- function(..., arg1) {
  args <- Filter(function(x) x!="...", names(formals()))
  as.list(environment())[args]
}

capture_dots("abc", arg1 = 1, arg2 = 2)

或者,如果您在函数的早期运行它,则点将不会扩展,并且不会有任何其他变量,因此您可以使用

来获取当前环境
capture_dots <- function(..., arg1) {
  as.list(environment())
}