R语言 查找调用函数的丢失参数

hs1ihplo  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(157)

我正在尝试编写一个函数,它可以返回调用函数中缺少的参数。

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

但是忽略abc
更新答案:

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()

4ktjp1zp

4ktjp1zp1#

我不经常深入研究这类机制,所以我不确定这有多健壮或“惯用”,但我认为这达到了您想要的效果。

find_missing_args <- function(...) {
  a1 <- rlang::call_args_names(rlang::caller_call(n = 1))
  a2 <- rlang::fn_fmls_names(rlang::caller_fn(n = 1))
  setdiff(a2,a1)
}

func <- function(x, y, z) {
  find_missing_args()
}

func(x = 1,y = 2)

相关问题