查找没有默认值的函数参数

时间:2016-01-22 03:40:41

标签: r

如何可靠地判断形式函数参数是否具有函数外部的默认值?

在下面的示例中,我希望确保以下测试在参数具有或不具有默认值时无法找到:

myfun <- function(a, b=1, ...) {}
formals(myfun)
for (n in names(formals(myfun))) {
  if (is.name(formals(myfun)[[n]])) {
    cat(n, "has no default value\n")
  } else {
    cat(n, "has a default value:", formals(myfun)[[n]], "\n")
  }
}

is.name是我提出的最好的测试,但我更愿意看到它是一个名字而且它是空的(或更好,但更确定的测试像missing一样会在函数内部提供。)

1 个答案:

答案 0 :(得分:5)

您可以进行空字符串比较,以测试每个值是否为空:

myfun <- function(a, b=1, ...) {}
formals(myfun)
for (n in names(formals(myfun))) {
  if (formals(myfun)[[n]] == "") {
    cat(n, "has no default value\n")
  } else {
    cat(n, "has a default value:", formals(myfun)[[n]], "\n")
  }
}
  

a没有默认值
  b有一个默认值:1
  ...没有默认值

更新但可能需要处理的情况&#34;&#34;作为空缺字符串的定义:

myfun <- function(a, b=1, c="", ...) {}
formals(myfun)
for (n in names(formals(myfun))) {
  if (!nzchar(formals(myfun)[[n]]) & is.name(formals(myfun)[[n]])) {
    cat(n, "has no default value\n")
  } else {
    cat(n, "has a default value:", formals(myfun)[[n]], "\n")
  }
}
  

a没有默认值
      b有一个默认值:1
      c有一个默认值:
      ...没有默认值

额外编辑以获得完整性:要在结果中实际显示空引号字符并定义formals(myfun)而不是一遍又一遍地调用它:

myfun <- function(a, b=1, c="", ...) {}
myfun_args <- formals(myfun)
for (n in names(myfun_args)) {
  if (!nzchar(myfun_args[[n]]) & is.name(myfun_args[[n]])) {
    cat(n, "has no default value\n")
  } else {
        if (!nzchar(myfun_args[[n]])) 
            cat(n, "has a default value:", dQuote(myfun_args[[n]]), "\n")
        else
            cat(n, "has a default value:", myfun_args[[n]], "\n")
  }

}
  

a没有默认值
  b有一个默认值:1
  c有一个默认值:“”
  ...没有默认值