Что означает использование метода здесь? - PullRequest
18 голосов
/ 25 ноября 2011

Одной из особенностей kool в R является то, что если я наберу имя функции, то получу возможность увидеть реализацию. Но этот смущает меня, рекурсивно:

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

x - это объект XTS, так что это не значит, что он вызовет метод align.time XTS ... но это то, на что я смотрю! (Ввод xts::align.time дает точно такой же ответ.)

Ответы [ 2 ]

25 голосов
/ 25 ноября 2011

Краткий ответ: вы ищете функцию xts:::align.time.xts.

Более длинный ответ заключается в том, что вы можете узнать, какие методы существуют для align.time, вызвав methods:

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

   Non-visible functions are asterisked

Это говорит о том, что существует метод align.time.xts, который не экспортируется из пространства имен. На данный момент вы, вероятно, можете догадаться, что его можно найти в пакете xts, но вы можете подтвердить это с помощью 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>

Конечно, вы можете читать источник напрямую, но поскольку функция не экспортируется, вам нужно использовать package:::function (то есть три двоеточия):

> 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 голосов
/ 25 ноября 2011

align.time() экспортируется из пространства имен xts , поэтому xts::align.time и align.time - это одно и то же.Вы должны заметить, что в пакете есть метод align.time() для объектов класса "xts", который не экспортируется из пространства имен (он просто зарегистрирован как метод 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>

Этот метод вызывается, когда вы передаете объект "xts" в align.time().

При вызове align.time() UseMethod() настраивает поиск и вызов соответствующего "align.time"метод, если доступен, для класса объекта, предоставленного в качестве первого аргумента.UseMethod делает именно то, что, как вы думаете, делает, вы просто запутались, глядя на одну и ту же функцию (универсальную) двумя различными способами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...