R检查是否有任何遗漏的参数

Nic*_*ton 6 arguments r function optional

我有一个带有许多参数的函数.如果缺少任何错误,我需要抛出错误:

这可以这样做:

testFunction = function(a,b,c,d,e,f,g,....){
  if(missing(a)) stop("a is required")
  if(missing(b)) stop("b is required")
  if(missing(c)) stop("c is required")
  if(missing(d)) stop("d is required")
  if(missing(e)) stop("e is required")
  if(missing(f)) stop("f is required")
  if(missing(g)) stop("g is required")
}
Run Code Online (Sandbox Code Playgroud)

但是我的实际案例包含的参数多于上面的简单示例,因此,我宁愿使用循环执行等效检查,如下所示:(这不起作用)

testFunction = function(a,b,c,d,e,f,g,...){
  args = as.list(environment())
  for(n in names(args)){
    if(missing(as.name(n))) stop(sprintf("%s is required",n))
  }
}
Run Code Online (Sandbox Code Playgroud)

上面抛出一个错误:

Error in missing(as.name(n)) : invalid use of 'missing'

如何通过参数名称的字符表示检查参数是否缺失?

MrF*_*ick 7

相反,这样的事情怎么样

f <- function(a,b,c,d) {
    defined <- ls()
    passed <- names(as.list(match.call())[-1])

    if (any(!defined %in% passed)) {
        stop(paste("missing values for", paste(setdiff(defined, passed), collapse=", ")))
    }
    a+b+c+d
}
Run Code Online (Sandbox Code Playgroud)

它就是这样的

f(1)
# Error in f(1) : missing values for b, c, d
f(2, d=3)
# Error in f(2, d = 3) : missing values for b, c
f(1,2,3,4)
# [1] 10
Run Code Online (Sandbox Code Playgroud)

基本上我们ls()用来获取当时函数中的变量列表(应该是所有参数)然后我们match.call()用来查看实际传递给函数的内容.