2013-04-10 32 views
10

Ai đó có thể giải thích tại sao quá tải một toán tử trên lớp S3 cũ được đăng ký không hoạt động như mong đợi khi xác định lớp mới và quá tải toán tử công việc.toán tử quá tải khi sử dụng setOldClass không hoạt động như mong muốn so với lớp S4

Như minh họa trong các ví dụ sau.

Điều này không có tác dụng.

require(ff) 
setOldClass(Classes=c("ff_vector")) 
setMethod( 
    f="*", 
    signature = signature(e1 = c("ff_vector"), e2 = c("ff_vector")), 
    definition = function (e1, e2){ 
     print("S3 setOldClass") 
     e1[] * e2[] 
    } 
) 
ff(1:10) * ff(1:10) 
Error in ff(1:10) * ff(1:10) : non-numeric argument to binary operator 

Nhưng tính năng này hoạt động.

setClass("myff_vector", representation(x="ff_vector")) 
setMethod( 
    f="*", 
    signature = signature(e1 = c("myff_vector"), e2 = c("myff_vector")), 
    definition = function (e1, e2){ 
     print("S4 setOldClass") 
     [email protected][] * [email protected][] 
    } 
) 
new("myff_vector", x = ff(1:10)) * new("myff_vector", x = ff(1:10)) 
[1] "S4 setOldClass" 
[1] 1 4 9 16 25 36 49 64 81 100 

Trả lời

0

Nỗ lực tại một câu trả lời phần: Trong sự giúp đỡ ('phương pháp'), trong Chức năng Generic phần, nó được phát biểu:

Các phương pháp có thể được xác định đối với hầu hết nguyên thủy, và tương ứng siêu dữ liệu đối tượng sẽ được tạo để lưu trữ chúng. Các cuộc gọi đến nguyên thủy vẫn đi trực tiếp vào mã C, đôi khi sẽ kiểm tra các phương thức áp dụng . Định nghĩa “đôi khi” là các phương pháp phải được phát hiện cho hàm trong một số gói được tải trong phiên và isS4 (x) là TRUE cho đối số đầu tiên (hoặc đối số thứ hai, trong trường hợp toán tử nhị phân).

Về vấn đề của bạn, * là một nguyên thủy, và:

library(ff) 
setOldClass("ff_vector") 
isS4(ff(1:10)) 
[1] FALSE 

Vì vậy, từ những gì tôi hiểu, nó không phải là có thể xác định một phương pháp cho các chức năng nguyên thủy trên lớp S3, ngay cả khi bạn sử dụng setOldClass().

0

Nó không thực sự rõ ràng từ câu hỏi liệu điều này đếm như một câu trả lời, nhưng đối với các hồ sơ, các nhà điều hành có thể bị quá tải ở đồng bằng và đơn giản S3 mang phong cách, mà không cần bất kỳ setOldClass hoặc S4:

`*.ff_vector` <- function(x, y) { 
    print("hi") 
    x[] * y[] 
} 

> ff(1:10) * ff(1:10) 
[1] "hi" 
[1] 1 4 9 16 25 36 49 64 81 100