2011-11-25 44 views
13

Một trong những điều kool về R là nếu tôi nhập tên hàm tôi nhận được để xem triển khai. Nhưng điều này là khó hiểu tôi, đệ quy:useMethod có nghĩa là gì ở đây?

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

x là một đối tượng XTS, vì vậy không có nghĩa là nó sẽ gọi phương thức align.time XTS ... nhưng đó là những gì tôi đang nhìn vào! (Gõ xts::align.time chính xác cho câu trả lời tương tự.)

+2

Xem thêm những câu hỏi này rất giống nhau: http://stackoverflow.com/q/5835312/602276 – Andrie

+1

vòng 7 http: // www. burns-stat.com/pages/Tutor/R_inferno.pdf có thể giúp bạn một ý thức về các chức năng và phương thức chung chung là gì. –

+0

@PatrickBurns Cảm ơn bạn, có vẻ như một bài đọc hữu ích. –

Trả lời

16

Câu trả lời ngắn gọn là bạn đang tìm kiếm hàm xts:::align.time.xts.

Câu trả lời còn là bạn có thể tìm thấy những phương thức tồn tại cho align.time bằng cách gọi methods:

> methods(align.time) 
[1] align.time.POSIXct* align.time.POSIXlt* align.time.xts*  

    Non-visible functions are asterisked 

này sẽ cho bạn biết rằng có một phương pháp align.time.xts không được xuất khẩu từ các namespace. Tại thời điểm này bạn có thể đoán rằng nó có thể được tìm thấy trong gói xts, nhưng bạn có thể khẳng định rằng với 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> 

Bạn có thể, tất nhiên, đọc các nguồn trực tiếp, nhưng kể từ khi chức năng là không xuất khẩu, bạn cần phải sử dụng package:::function (tức là ba dấu hai chấm):

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

align.time() được xuất khẩu từ XTS namespace, vì vậy xts::align.timealign.time là những điều tương tự. Bạn cần lưu ý rằng có một phương pháp align.time() cho các đối tượng của lớp "xts" được cung cấp trong gói và không được xuất khẩu từ không gian tên (nó chỉ được đăng ký như một phương pháp 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> 

Đó là phương pháp này mà đang được gọi khi bạn chuyển một đối tượng "xts" đến align.time().

Khi bạn gọi align.time()UseMethod() thiết lập tìm kiếm và gọi phương thức thích hợp "align.time", nếu có, đối với lớp đối tượng được cung cấp làm đối số đầu tiên. UseMethod đang làm chính xác những gì bạn nghĩ rằng nó đang làm, bạn vừa nhầm lẫn bản thân bằng cách nhìn vào cùng một chức năng (chung) theo hai cách khác nhau.

+0

+1 để sửa đổi ;-) – Andrie

+1

:-) quay lại ngay với bạn. OP cũng nên tính đến đạo hàm đầu tiên của các hồ sơ đại diện tương ứng của chúng tôi khi quyết định trao giải chấp nhận. Bạn đang lái xe trước muộn! ;-) –