9

我从 R 中的 all.equal 方法得到了意外的输出,特别是 POSIXct 的实现,all.equal.POSIXct。

t <- Sys.time()
isTRUE(all.equal(t, t+1))

返回 TRUE,并且

isTRUE(all.equal(t, t+1, scale = 1))

返回 FALSE。

但是,如果查看 all.equal.POSIXct 的定义,可以看到 scale 参数的默认值为 1:

> all.equal.POSIXct
function (target, current, ..., scale = 1) 
{
    check_tzones(target, current)
    NextMethod("all.equal")
}
<bytecode: 0x22eac90>
<environment: namespace:base>

如果显式调用 all.equal.POSIXct 而不是 all.equal,则会得到相同的结果。

为什么在第一次调用 all.equal.POSIXct 时没有选择默认参数 scale = 1?我做错了什么,还是我从根本上误解了某些东西,或者这是一个错误?

提前感谢您的帮助。

4

2 回答 2

7

我在这里有点小题大做,但我认为你发现了一个错误。

这是我建议的修复:

all.equal.POSIXct <- function (target, current, ..., scale = 1) {
  check_tzones(target, current)
  NextMethod("all.equal", scale=scale, ...)
}

然后该函数给出正确的结果:

all.equal(t, t+1)
[1] "Mean scaled difference: 1"

all.equal(t, t+1, scale=10)
[1] "Mean scaled difference: 0.1"

这就是现有代码不起作用的原因:

的定义all.equal是:

all.equal <- function (target, current, ...) UseMethod("all.equal")
  • 请注意,有三个参数targetcurrent...

  • 因此,每当您使用NextMethod这三个参数时,都会将其传递给下一个方法。

  • 但是,在all.equal.POSIXct存在附加参数的情况下,scale=它不会被隐式或显式传递。

于 2012-07-02T12:56:49.857 回答
6

看起来像一个错误。我不是方法调度方面的专家,但需要将?NextMethod建议的快速阅读添加到调用中:scale=scaleNextMethodall.equal.POSIXct

all.equal.POSIXct <-
function (target, current, ..., scale = 1) 
{
    check_tzones(target, current)
    NextMethod("all.equal", scale=scale)
}
于 2012-07-02T12:55:53.197 回答