Что означает useMethod здесь?

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

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

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

2 ответов


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

align.time() экспортируется из xts пространство имен, so 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 делает именно то, что вы думаете, что он делает, вы просто смутили себя, глядя на одну и ту же функцию (общий) двумя разными способами.