关于R的一个关键是,如果我输入函数名称,我会看到实现.但这个让我感到困惑,递归:
> library(xts)
> align.time
function (x, ...)
{
UseMethod("align.time")
}
<environment: namespace:xts>
Run Code Online (Sandbox Code Playgroud)
x是一个XTS对象,所以这并不意味着它将调用XTS align.time方法......但这就是我正在看的东西!(键入xts::align.time会给出完全相同的响应.)
And*_*rie 26
简短的回答是你正在寻找这个功能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
Run Code Online (Sandbox Code Playgroud)
这告诉您有一个方法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>
Run Code Online (Sandbox Code Playgroud)
当然,您可以直接读取源代码,但由于该函数未导出,因此您需要使用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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
传递"xts"对象时正在调用此方法align.time().
当您调用时,align.time() UseMethod()设置搜索并调用适当的"align.time"方法(如果可用),作为第一个参数提供的对象类.UseMethod你正在做你正在做的事情,你只是以两种不同的方式看待同一个函数(通用)而让自己感到困惑.
| 归档时间: |
|
| 查看次数: |
8636 次 |
| 最近记录: |