all.equal.POSIXct的意外输出

Ash*_*Ash 9 r posixct

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

t <- Sys.time()
isTRUE(all.equal(t, t+1))
Run Code Online (Sandbox Code Playgroud)

返回TRUE,然后

isTRUE(all.equal(t, t+1, scale = 1))
Run Code Online (Sandbox Code Playgroud)

返回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>
Run Code Online (Sandbox Code Playgroud)

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

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

在此先感谢您的帮助.

And*_*rie 7

我在这里走得很轻,但我觉得你发现了一个错误.

这是我建议的修复:

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

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

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

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

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

定义all.equal是:

all.equal <- function (target, current, ...) UseMethod("all.equal")
Run Code Online (Sandbox Code Playgroud)
  • 请注意,有三个参数:target,current....

  • 因此,无论何时使用NextMethod这三个参数都将传递给下一个方法.

  • 但是,如果all.equal.POSIXct存在其他参数scale=,则不会隐式或显式传递.


Jos*_*ich 6

看起来像个bug.我不是方法调度方面的专家,但需要在调用中快速阅读?NextMethod建议:scale=scaleNextMethodall.equal.POSIXct

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