all.equal.POSIXct的意外输出

时间:2012-07-02 12:38:56

标签: r posixct

我从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?我做错了什么,或者我从根本上误解了什么,或者这是一个错误?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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=,但这不会被隐式或显式传递。

答案 1 :(得分:6)

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

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