这里的 useMethod 是什么意思?

27

R中的一个很酷的功能是,如果我输入函数名称,我就可以看到其实现。但这个递归函数让我感到困惑:

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

x是一个XTS对象,那么这不意味着它会调用XTS align.time方法...但这正是我想要的!(输入xts::align.time得到的响应完全相同。)


2
另请参阅非常类似的问题:https://dev59.com/b2025IYBdhLWcg3wtofX - Andrie
2
阅读http://www.burns-stat.com/pages/Tutor/R_inferno.pdf的第7章,可以帮助你了解通用函数和方法的概念。 - Patrick Burns
@PatrickBurns 谢谢,看起来这是一篇有用的阅读材料。 - Darren Cook
谢谢回复,都非常有用(我选择了Andrie因为他需要积分比Gavin多;-)。下次我会尝试记住methods()和三个冒号当我卡住的时候。 - Darren Cook
2个回答

37

简短的回答是,您正在寻找函数xts:::align.time.xts

更详细的回答是,您可以通过调用methods来查找align.time存在哪些方法:

> 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>

8

align.time() 是从 xts 命名空间导出的,所以 xts::align.timealign.time 是同一件事。您需要注意,在该软件包中提供了类"xts"align.time() 方法,并且未从命名空间导出(它只是注册为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()正是在做你认为它在做的事情,只不过你看了两种不同方式的同一个函数(即泛型函数),让自己感到困惑。

1
回传一个笑脸给你。楼主在决定是否授予采纳时,也应考虑我们各自声望档案的一阶导数。最近你的进展很快啊!;-) - Gavin Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接