gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:40:29 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com