2012-07-02 15 views
9

mi sto uscita inaspettata dal metodo all.equal in R, in particolare l'implementazione per POSIXct, all.equal.POSIXct.uscita imprevista da all.equal.POSIXct

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

ritorna vero, e

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

restituisce false.

Tuttavia, se si guarda alla definizione di all.equal.POSIXct, si può vedere che il parametro di scala ha un valore predefinito di 1:

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

si ottiene lo stesso risultato se si chiama in modo esplicito tutti. equal.POSIXct invece di all.equal.

Perché non è il parametro di scala di default = 1 viene raccolto nella prima chiamata a all.equal.POSIXct? Sto facendo qualcosa di sbagliato, o ho fondamentalmente frainteso qualcosa, o è un bug?

Grazie in anticipo per qualsiasi aiuto.

+0

Questa è una grande domanda. Entrambe le risposte suggeriscono che potrebbe essere un bug, quindi ho presentato una segnalazione di bug all'indirizzo https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14969 – Andrie

+0

Fantastico, grazie per aver inviato il bug report! Stavo per fare lo stesso! – Ash

risposta

7

Io vado su una lieve arto qui, ma penso hai scoperto un bug.

Qui è la mia correzione suggerita:

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

Allora la funzione fornisce i risultati corretti:

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

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

Questo è il motivo per cui il codice esistente non funziona:

La definizione per all.equal è:

all.equal <- function (target, current, ...) UseMethod("all.equal") 
  • Si noti che ci sono tre argomenti: target, current e ....

  • Pertanto, ogni volta che si utilizza NextMethod questi tre argomenti verranno passati al metodo successivo.

  • Tuttavia, nel caso di all.equal.POSIXct c'è un argomento aggiuntivo scale=, ma questo non viene trasmesso in modo implicito o esplicito.

6

Sembra un bug. Io non sono un esperto di metodo di spedizione, ma una rapida lettura di ?NextMethod suggerisce scale=scale deve essere aggiunto alla chiamata in NextMethodall.equal.POSIXct:

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