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 の代わりに all.equal.POSIXct を明示的に呼び出すと、同じ結果が得られます。

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およびの 3 つの引数があることに注意してください...

  • したがって、これら 3 つの引数を使用するたび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 に答える