2012-07-02 12 views
9

Obtengo resultados inesperados del método all.equal en R, específicamente la implementación de POSIXct, all.equal.POSIXct.Resultado inesperado de all.equal.POSIXct

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

devuelve TRUE, y

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

devuelve false.

Sin embargo, si nos fijamos en la definición de all.equal.POSIXct, se puede ver que el parámetro de escala tiene un defecto de 1:

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

se obtienen los mismos resultados si se llama explícitamente a todos. equal.POSIXct en lugar de all.equal.

¿Por qué no se selecciona el parámetro predeterminado scale = 1 en la primera llamada a all.equal.POSIXct? ¿Estoy haciendo algo mal, o básicamente he malentendido algo, o es esto un error?

Gracias de antemano por cualquier ayuda.

+0

Esta es una gran pregunta. Ambas respuestas a continuación sugieren que podría ser un error, por lo que he presentado un informe de error en https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14969 – Andrie

+0

¡Genial, gracias por enviar el informe de error! ¡Estaba a punto de hacer lo mismo! – Ash

Respuesta

7

Voy a salir en una ligera miembro aquí, pero creo has descubierto un error.

Aquí está mi solución sugerida:

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

Entonces la función da los resultados correctos:

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

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

Es por esto que el código existente no funciona:

La definición de all.equal es:

all.equal <- function (target, current, ...) UseMethod("all.equal") 
  • en cuenta que hay tres argumentos: target, current y ....

  • Por lo tanto, siempre que use NextMethod estos tres argumentos se pasarán al siguiente método.

  • Sin embargo, en el caso de all.equal.POSIXct hay un argumento adicional scale=, pero esto no se transfiere implícita o explícitamente.

6

Parece un error. No soy un experto en la expedición método, pero una lectura rápida de ?NextMethod sugiere scale=scale necesidades que se añadirán a la llamada NextMethod en all.equal.POSIXct:

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