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