2011-11-25 14 views
13

Una de las cosas más importantes sobre R es si escribo el nombre de la función que veo para ver la implementación. Pero este me está confundiendo, de forma recursiva:¿Qué significa useMethod aquí?

> library(xts) 
> align.time 
function (x, ...) 
{ 
    UseMethod("align.time") 
} 
<environment: namespace:xts> 

x es un objeto XTS, por lo que no significa que vaya a llamar al método align.time XTS ... pero eso es lo que estoy mirando! (Escribiendo xts::align.time da exactamente la misma respuesta.)

+2

Véase también esta pregunta muy similar: http://stackoverflow.com/q/5835312/602276 – Andrie

+1

Círculo 7 de http: // www. burns-stat.com/pages/Tutor/R_inferno.pdf podría ayudarlo a obtener un sentido de qué funciones y métodos genéricos se trata. –

+0

@PatrickBurns Gracias, parece una lectura útil. –

Respuesta

16

La respuesta corta es que usted está buscando la función xts:::align.time.xts.

La respuesta larga es que se pueden encontrar los métodos que existen para align.time llamando methods:

> methods(align.time) 
[1] align.time.POSIXct* align.time.POSIXlt* align.time.xts*  

    Non-visible functions are asterisked 

Esto le indica que hay un método align.time.xts que no se exporta desde el espacio de nombres. En este punto, es fácil adivinar que se puede encontrar en el paquete xts, pero se puede confirmar que con getAnywhere:

> getAnywhere("align.time.xts") 
A single object matching 'align.time.xts' was found 
It was found in the following places 
    registered S3 method for align.time from namespace xts 
    namespace:xts 
with value 

function (x, n = 60, ...) 
{ 
    if (n <= 0) 
     stop("'n' must be positive") 
    .xts(x, .index(x) + (n - .index(x)%%n), tzone = indexTZ(x), 
     tclass = indexClass(x)) 
} 
<environment: namespace:xts> 

Usted puede, por supuesto, leer la fuente directamente, pero ya que la función es no se exporta, es necesario utilizar package:::function (es decir, tres colones):

> xts:::align.time.xts 
function (x, n = 60, ...) 
{ 
    if (n <= 0) 
     stop("'n' must be positive") 
    .xts(x, .index(x) + (n - .index(x)%%n), tzone = indexTZ(x), 
     tclass = indexClass(x)) 
} 
<environment: namespace:xts> 
7

align.time() se exporta desde el XTS espacio de nombres, por lo xts::align.time y align.time son la misma cosa. Es necesario tener en cuenta que hay un método align.time() de objetos de la clase "xts" proporcionados en el paquete y que no se exporta desde el espacio de nombres (sólo se ha registrado como un método S3):

> xts:::align.time.xts 
function (x, n = 60, ...) 
{ 
    if (n <= 0) 
     stop("'n' must be positive") 
    .xts(x, .index(x) + (n - .index(x)%%n), tzone = indexTZ(x), 
     tclass = indexClass(x)) 
} 
<environment: namespace:xts> 

Es este método que se llama cuando pasa un objeto "xts" al align.time().

Cuando llame al align.time()UseMethod() configura la búsqueda y llama al método "align.time" apropiado, si está disponible, para la clase del objeto suministrado como primer argumento. UseMethod está haciendo exactamente lo que cree que está haciendo, acaba de confundirse al observar la misma función (la genérica) de dos maneras diferentes.

+0

+1 para hacer las paces ;-) – Andrie

+1

:-) de vuelta a usted. El OP también debe tener en cuenta la primera derivada de nuestros respectivos perfiles de representante al momento de decidir sobre la concesión de la aceptación. ¡Estás conduciendo antes de tarde! ;-) –