我从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?我做错了什么,或者我从根本上误解了什么,或者这是一个错误?
提前感谢您的帮助。
答案 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")
请注意,有三个参数:target
,current
和...
。
因此,无论何时使用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)
}