我正在尝试编写一个函数,它可以返回调用函数中缺少的参数。
find_missing_args <- function(...) {
args <- rlang::enquos(...)
lapply(args, rlang::is_missing)
}
func <- function(x, y, z) {
find_missing_args(x, y, z)
}
但是,功能并不符合预期:
func(x = 1, y = 2)
返回
[[1]]
[1] FALSE
[[2]]
[1] FALSE
[[3]]
[1] FALSE
它应返回:
[[1]]
[1] FALSE
[[2]]
[1] FALSE
[[3]]
[1] TRUE
因为z
没有在调用函数中提供,所以我也希望能够将我关心的参数传递给find_missing_args
,例如:
find_missing_args <- function(...) {
args <- rlang::enquos(...)
lapply(args, rlang::is_missing)
}
func <- function(x, y, z, a, b, c) {
find_missing_args(x, y, z)
}
func(x = 1, y = 2, a = 3, b = 4)
将返回:
[[1]]
[1] FALSE
[[2]]
[1] FALSE
[[3]]
[1] TRUE
但是忽略a
、b
、c
。
更新答案:
find_missing_args <- function(args) {
supplied <- rlang::call_args_names(rlang::caller_call(n = 1))
setdiff(args, supplied)
}
func <- function(x, y, z, a, b, d) {
find_missing_args(c("x","y","z"))
}
func(x = 1, y = 2)
[1] "z"
有趣的是,
find_missing_args <- function(args) {
supplied <- rlang::call_args_names(rlang::caller_call(n = 1))
setdiff(args, supplied)
}
func <- function(x, y, z, a, b, c) {
find_missing_args(c("x","y","z"))
}
func(x = 1, y = 2)
Error in c("x", "y", "z") : argument "c" is missing, with no default
我还没有弄明白为什么它将c()
解释为参数c
,而不是函数c()
。
1条答案
按热度按时间4ktjp1zp1#
我不经常深入研究这类机制,所以我不确定这有多健壮或“惯用”,但我认为这达到了您想要的效果。