如何可靠地判断形式函数参数是否具有函数外部的默认值?
在下面的示例中,我希望确保以下测试在参数具有或不具有默认值时无法找到:
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
一样会在函数内部提供。)
答案 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有一个默认值:“”
...没有默认值