2011-11-25 2 views
13

Una delle cose di Kool su R è se scrivo il nome della funzione. Vedo l'implementazione. Ma questo mi è fonte di confusione, in modo ricorsivo:Cosa significa useMethod qui?

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

x è un oggetto XTS, quindi non significa che si chiamerà il metodo align.time XTS ... ma questo è quello che sto guardando! (Digitando xts::align.time dà esattamente la stessa risposta.)

+2

Vedi anche questa domanda molto simile: http://stackoverflow.com/q/5835312/602276 – Andrie

+1

Circle 7 di http: // www. burns-stat.com/pages/Tutor/R_inferno.pdf potrebbe aiutarti a ottenere un senso di ciò che sono funzioni e metodi generici. –

+0

@PatrickBurns Grazie, sembra una lettura utile. –

risposta

16

La risposta breve è che si sta cercando la funzione xts:::align.time.xts.

La risposta è più che si può trovare quali metodi esistono per align.time chiamando methods:

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

    Non-visible functions are asterisked 

Questo vi dice che c'è un metodo align.time.xts che non viene esportato dallo spazio dei nomi. A questo punto, probabilmente si può intuire che si può trovare nel pacchetto xts, ma si può confermare che 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> 

È possibile, naturalmente, leggere direttamente la fonte, ma dal momento che la funzione è non esportato, è necessario utilizzare package:::function (cioè tre due punti):

> 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() viene esportata dal XTS spazio dei nomi, così xts::align.time e align.time sono la stessa cosa. È necessario notare che v'è un metodo align.time() per gli oggetti della classe "xts" previste nel pacchetto e che non viene esportato dallo spazio dei nomi (è appena registrata come metodo 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> 

È questo metodo che viene chiamato quando si passa un oggetto "xts" a align.time().

Quando si chiama align.time()UseMethod() imposta la ricerca e chiama il metodo "align.time" appropriato, se disponibile, per la classe dell'oggetto fornita come primo argomento. UseMethod sta facendo esattamente quello che pensi che stia facendo, ti sei solo confuso guardando la stessa funzione (il generico) in due modi diversi.

+0

+1 per fare ammenda ;-) – Andrie

+1

:-) proprio di nuovo a voi. Il PO dovrebbe anche tener conto del primo derivato dei nostri rispettivi profili di rappresentante al momento di decidere sull'assegnazione dell'accettazione. Sei in motorino prima di tardi! ;-) –