2016-01-22 9 views
5

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

在下面的例子中,我想,以确保当一个参数已经或没有默认值下面的测试将不会失败发现:

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将提供功能内)。

回答

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") 
    } 
} 

一个没有缺省值
B有一个默认值:1
......没有默认价值

更新的希望治疗“” AS空字符串定义的默认罕见但可能的案例:

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") 
    } 
} 

一个没有默认值
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") 
    } 

} 

一个没有默认值
B有一个默认值:1个
C有一个默认值:“”
......没有默认值

+0

@jenesaisquoi - 这绝对清洁为基础案例。正如@RichardScriven之前指出的那样,它并没有把''“'作为空字符的默认值处理。 –

+0

“相同”可能会更好。因为OP在这种情况下在更大规模上使用这种情况下的速度优势,所以我使用'nzchar'。 –

+0

@jenesaisquoi:同意。这里'=='不是很好。 –