【问题标题】:R Test parmeters of functions passed to a function before evaluationR在评估之前测试传递给函数的函数参数
【发布时间】:2015-09-09 11:38:29
【问题描述】:

我想构造一个函数(我们称之为 f()),它将作为参数两个 其他函数(f1(),f2())。 f1 和 f2 都有自己的参数。 我希望 f() 在评估 f1() 和 f2() 之前对传递的参数进行一些测试 以 f1() 和 f2() 为例,验证它们的名称是否相同。 简而言之,我想要这样的东西:

f<-function(f1(param),f2(param)){
f1Param<-#get the param argument of f1
f2Param<-#get the param argument of f2
stopifnot(identical(names(f1Param),names(f2Param)))
#evaluate f1(param) and f2(param) and do some opertaions on the outputs
}

但我不确定如何从 f1() 和 f2() 中提取参数然后获取它们 评估。 我看到了一些建议来解决这个问题match.call()mget()。 然而,在给出的例子中,被调用函数唯一要做的就是返回它的参数, 我实际上希望我的函数做一些事情。 有没有什么办法可以使用say, match.call() 来测试环境中的参数 调用函数(在我的示例中为 f()),然后决定是否基于评估 f1 和 f2 测试结果?

提前致谢

【问题讨论】:

  • 在这种情况下,您最好修改您的 f() 以接受 4 个参数,这两个函数及其各自的参数(作为一个列表)。如果这是不可能的,我认为没有办法实现这一点,因为函数调用被延迟评估,你不能在函数调用本身之前真正访问它们

标签: r function arguments


【解决方案1】:

按照 Tensibai 的建议,您可以执行以下操作:

f <- function(f1, f2, f1Param, f2Param){
  stopifnot(is.list(f1Param) && is.list(f2Param))
  stopifnot(identical(names(f1Param),names(f2Param)))
  do.call(f1, f1Param) == do.call(f2, f2Param)
}

一个例子是:

> f(mean, mean, list(x = 1:10), list(x = 2:9))
[1] TRUE
> f(mean, mean, list(x = 1:10), list(y = 2:9))
# ERROR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2013-08-31
    • 2020-11-14
    • 1970-01-01
    • 2015-02-17
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多