2011-11-25 9 views
13

Jedną z rzeczy kool o R jest to, że wpisuję nazwę funkcji, aby uzyskać implementację. Ale ten jest mylące mnie, rekurencyjnie:Co oznacza tutaj metoda UseMethod?

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

x jest obiektem XTS, więc nie ma to znaczy, że będzie ona wywołać metodę align.time XTS ... ale to jest to, czego szukam w! (Wpisanie xts::align.time daje dokładnie taką samą odpowiedź.)

+2

Zobacz również tej bardzo podobne pytanie: http://stackoverflow.com/q/5835312/602276 – Andrie

+1

grono 7 z http: // www. burns-stat.com/pages/Tutor/R_inferno.pdf może ci pomóc poczucie, jakie są ogólne funkcje i metody. –

+0

@PatrickBurns Dzięki, to wygląda na przydatną lekturę. –

Odpowiedz

16

Krótka odpowiedź brzmi, że szukasz funkcji xts:::align.time.xts.

Dłuższa odpowiedź jest taka, że ​​można dowiedzieć się, jakie metody istnieją align.time wywołując methods:

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

    Non-visible functions are asterisked 

Ten mówi, że nie jest to metoda align.time.xts które nie są wywożone z obszaru nazw. W tym momencie można się domyślić, że można go znaleźć w pakiecie xts, ale można potwierdzić, że z 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> 

Można, oczywiście, czytać źródła bezpośrednio, ale ponieważ funkcja ta jest nie wywiezione, trzeba użyć package:::function (tj trzy dwukropka):

> 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() jest wyprowadzany z XTS nazw, więc xts::align.time i align.time to samo. Trzeba pamiętać, że istnieje align.time() metoda dla obiektów klasy "xts" dostarczonych w opakowaniu i że nie są wywożone z obszaru nazw (jest tylko zarejestrowany jako metoda 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> 

Jest to metoda, która jest wywoływana, gdy przekazujesz obiekt "xts" do .

Po wywołaniu align.time()UseMethod() ustawia wyszukiwanie i wywołanie odpowiedniej metody "align.time", jeśli jest dostępna, dla klasy obiektu podanego jako pierwszy argument. UseMethod robi dokładnie to, co myślisz, że robisz, po prostu pomyliłeś się, patrząc na tę samą funkcję (ogólną) na dwa różne sposoby.

+0

+1, aby naprawić ;-) – Andrie

+1

:-) od razu na ciebie. PO powinien również brać pod uwagę pierwszą pochodną naszych poszczególnych profili przedstawicieli przy podejmowaniu decyzji o przyznaniu akceptacji. Jeździsz z wyprzedzeniem! ;-) –