r - 如何检查修改后的函数形式

标签 r

在我永无止境的打破事物的追求中,
考虑:

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 进行“健全性”检查的功能的高级实用程序包现有功能?

最佳答案

编辑:

如果你只是想检查重复的参数,你可以这样做:

any(duplicated(names(formals(ffoo))))
# [1] TRUE

正如哈德利在下面的第二条评论中提到的那样,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

关于r - 如何检查修改后的函数形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25998435/

相关文章:

user-interface - R 脚本 : Determine whether the script is run in the GUI or from command line

r - 如何捕获system()的输出

r - 了解累加函数的工作原理

r - 涉及行特定和整组元素的组特定计算

r - 如何格式化 'gtsummary::tbl_summary' 中分类变量的位数?

r - 在 R 中计算年龄

r - 对于 i 循环,调用不同的数据帧

r - lme4:如何用随机截距指定 2 个相关性,而不在随机斜率之间添加相关性

R – 如何按最近的时间日期连接两个数据框?

r - 扩展数据框使其行数与原始行中两列的范围一样多