【问题标题】:How to compare functions?如何比较功能?
【发布时间】:2012-03-27 03:48:25
【问题描述】:

有没有办法比较两个函数对象是否相同?

m <- mean
m == mean ## don't work

## this seems not to be the correct way:
functionBody(mean)==functionBody(m)

编辑:更多细节。我有一个带有两个参数的函数(一个矩阵和一个按列应用的用户定义函数,例如均值、中值、...)。如果函数是mean,我想改用colMean(以节省一些运行时间)。

foo <- function(m, fun) {
  #if (fun==mean) {
  #  return(colMeans(m));
  #} else {
    return(apply(m, 2, fun));
  #}
}

【问题讨论】:

  • 你对“等函数”的定义是什么?如果您的意思是明显等效,那么您的问题是无法确定的!
  • 您可能会发现this 的问题很有帮助。
  • @BasileStarynkevitch 请查看我的编辑。

标签: r function


【解决方案1】:

你可以使用identical:

identical(m,mean)

【讨论】:

  • 反例:m
  • @DWin:很明显,这个方法只检查两个变量是否指向同一个函数,而不是使用的代码是否相同。如果 OP 需要后者,他/她就不会在身体检查 IMO 上写下“这似乎不是正确的方法”......
  • @DWin:但是,只有检查它们是否引用相同才能获得函数的 IMO 相等性;否则,是的,你可以处理几个案例,但基本上,正如 Basile 的评论中正确指出的那样,问题是无法确定的......
  • 我认为 function(x) (mean(x)} 将被认为与 function(y){mean(y)} 是“相同的”。我假设一个向导(显然不是我) 会过来向我们展示如何使用 substitute 使用形式 (fn) 作为 body(fn) 上的参数来进行比较。我知道这不会比较输入和输出的相等性,这将是 Basile 更正确的同一性标准。
  • @DWin:是的,也许可以为这种情况做点什么。但它并没有太大变化,因为无法识别许多(无限)其他情况(例如function(x){a=0;mean(x)+a})。
【解决方案2】:

您可以将函数转换为字符串, 并比较这些字符串。

equal_functions <- function(f,g)
  all( 
    capture.output(print(f)) ==
    capture.output(print(g))
  )
equal_functions(function(x) x, function(x) x) # TRUE

但因非必要原因而不同的功能将被视为不同。

equal_functions(function(x) x, function(u) u) # FALSE
equal_functions(
  function(x) x, 
  function(x) 
    x
) # FALSE

【讨论】:

    【解决方案3】:

    我使用isTRUE(all.equal(function1,function2)),但这与其他方法有类似的缺点。

    有趣的是,all.equal 很好地总结了这两个操作数的不同之处(试试all.equal(function1,function2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-04
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2020-09-07
      相关资源
      最近更新 更多