我从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?我做错了什么,或者我从根本上误解了什么,或者这是一个错误?
在此先感谢您的帮助.
我在这里走得很轻,但我觉得你发现了一个错误.
这是我建议的修复:
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=,则不会隐式或显式传递.
看起来像个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)