Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Короткий ответ заключается в том, что вы ищете функцию 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>

Ответ 2

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