在我彻底打破事情的过程中, 考虑:
gbar<-function(x,y,x,a) x+2*y-4*a
Error: repeated formal argument 'x' on line 1
R
正确检查我定义的函数是否存在非法形式。
但如果我手动搞砸了:
ffoo<-function(x,y,a) x+2*y-4*a
formals(ffoo)<-c(x=7, formals(ffoo))
然后我只会在某些情况下发现某些事情无效。
ffoo(3,4,5,6)
将正确执行(尽管可能没有给出我期望的答案),ffoo(y=3,a=2)
也是如此;而ffoo(x=5,y=3,a=2)
会抛出有关模糊参数名称的错误。
那么:是否有任何base-R
或高级实用程序包,其功能是对现有函数的formals
进行“完整性”检查?
答案 0 :(得分:4)
修改:
如果您只是想检查重复的参数,可以这样做:
any(duplicated(names(formals(ffoo))))
# [1] TRUE
正如Hadley在下面的第二条评论中提到的那样,dput()
并不能保证给你一个好的/完整的函数表示,所以可能有一些函数,我的原始答案中描述了这种方法(左边是(见下)失败。
原始回答:
正如在the C code pointed to by Andrie中暗示的那样,这显然是R在解析(不评估)对function()
的调用时执行的检查。这就是为什么你能够通过调用formals<-
来绕过检查,这就是为什么以下(例如)也避免被检查的原因。在这两种情况下,都会修改/创建函数,而不解析对function()
的调用。
eval(call("function", formals(ffoo), body(ffoo)))
# function (x = 7, x, y, a)
# x + 2 * y - 4 * a
R的解析机制通常不会暴露在用户可见的R函数中,所以我猜测没有现成的函数R函数来执行此检查。但是,您可以通过将函数定义转换为其字符表示形式然后尝试自行重新解析它来执行R来源表达式时执行的完全相同的检查集,或者在命令行处输入它。
以下是一般概念:
parse(text = capture.output(dput(ffoo)))
# Error in parse(text = capture.output(dput(ffoo))) :
# repeated formal argument 'x' on line 1
将检查包装为函数执行以下操作:
isParseableFunction <- function(x) {
tryCatch(is.function(x) &
is.expression(parse(text = capture.output(dput(x)))),
error = function(e) FALSE)
}
isParseableFunction(data.frame)
# [1] TRUE
isParseableFunction(mean)
# [1] TRUE
isParseableFunction(ffoo)
# [1] FALSE
isParseableFunction(99)
# [1] FALSE