2012-07-02 12 views
9

Ich bekomme unerwartete Ausgabe von der all.equal-Methode in R, speziell die Implementierung für POSIXct, all.equal.POSIXct.Unerwartete Ausgabe von all.equal.POSIXct

t <- Sys.time() 
isTRUE(all.equal(t, t+1)) 

TRUE zurück, und

isTRUE(all.equal(t, t+1, scale = 1)) 

FALSCH zurückgibt.

Wenn Sie jedoch bei der Definition von all.equal.POSIXct anschaut, kann man sehen, dass der Skalenparameter einen Standard von 1:

> all.equal.POSIXct 
function (target, current, ..., scale = 1) 
{ 
    check_tzones(target, current) 
    NextMethod("all.equal") 
} 
<bytecode: 0x22eac90> 
<environment: namespace:base> 

Sie die gleichen Ergebnisse erhalten, wenn Sie ausdrücklich alle nennen. equal.POSIXct anstelle von all.equal.

Warum wird nicht der Standardparameter scale = 1 beim ersten Aufruf von all.equal.POSIXct ausgewählt? Mache ich etwas falsch oder habe ich etwas grundlegend falsch verstanden, oder ist das ein Fehler?

Vielen Dank im Voraus für jede Hilfe.

+0

Das ist eine gute Frage. Beide Antworten deuten darauf hin, dass es sich um einen Fehler handeln könnte. Daher habe ich unter https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14969 einen Fehlerbericht eingereicht. – Andrie

+0

Cool, vielen Dank für das Einreichen des Fehlerberichts! Ich war gerade dabei dasselbe zu tun! – Ash

Antwort

7

Ich werde hier auf einem kleinen Fenster lehnen, aber ich denke, Sie haben einen Fehler entdeckt.

Hier ist meine vorgeschlagenen fix:

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

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

Aus diesem Grund ist der vorhandene Code nicht funktioniert:

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

Dann ist die Funktion, die richtigen Ergebnisse liefert Die Definition für all.equal lautet:

  • Hinweis, dass es drei Argumente: target, current und ....

  • Wenn Sie also NextMethod verwenden, werden diese drei Argumente an die nächste Methode übergeben.

  • Im Fall von all.equal.POSIXct gibt es jedoch ein zusätzliches Argument scale=, das jedoch weder implizit noch explizit weitergegeben wird.

6

Sieht aus wie ein Fehler. Ich bin kein Experte für Verfahren Versand, aber eine schnelle Lesen von ?NextMethod schlägt scale=scale Bedürfnisse der NextMethod Anruf in all.equal.POSIXct hinzugefügt werden:

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