Liên quan đến câu hỏi this, nhưng hơi khác và hy vọng rõ ràng hơn.Việc gửi kiểu S3 cho các đối tượng S3 sử dụng các định nghĩa phương thức chính thức
Tôi đang tìm kiếm sạch cách đăng ký chính thức các phương thức cho cả lớp S4 và S3, nhưng không dựa vào lược đồ đặt tên S3-dot khủng khiếp để gửi đi. Một ví dụ:
setClass("foo");
setClass("bar");
setGeneric("test", function(x, ...){
standardGeneric("test");
});
setMethod("test", "bar", function(x, ...){
return("success (bar).");
});
obj1 <- 123;
class(obj1) <- "bar";
test(obj1);
Ví dụ này cho thấy cách chúng ta có thể đăng ký một phương pháp test
cho các đối tượng S3 của lớp bar
, mà không cần phải đặt tên cho chức năng test.bar
, đó là rất tốt. Tuy nhiên, giới hạn là nếu chúng ta đăng ký các phương thức theo cách này, chúng sẽ chỉ được gửi đến lớp S3 đầu tiên của đối tượng. Ví dụ:
obj2 <- 123;
class(obj2) <- c("foo", "bar");
test(obj2);
Điều này không hiệu quả, vì cách gửi phương thức S4 sẽ chỉ thử lớp foo
và các lớp siêu hạng của nó. Làm thế nào ví dụ này có thể được mở rộng để nó sẽ tự động chọn phương pháp test
cho bar
khi không tìm thấy phương pháp thích hợp cho foo
? Ví dụ. Phong cách gửi S3 nhưng không phải quay lại đặt tên cho mọi thứ test.foo
và test.bar
?
Tóm lại: làm thế nào để tạo một hàm tổng quát sử dụng phương thức chính thức gửi đi, nhưng ngoài ra trở lại lớp thứ hai, thứ ba, vv của đối tượng cho đối tượng S3 với nhiều lớp.
Có, tôi đã làm điều gì đó tương tự; Tuy nhiên thực tế là bạn đang thực sự thay đổi thuộc tính lớp của x dọc theo cách có thể có tác dụng phụ không mong muốn ... Có cách nào bạn có thể gửi nó đến phương thức tiếp theo mà không sửa đổi đối tượng không? – Jeroen
Tôi không có câu trả lời cho bạn; Tôi nghĩ rằng phương pháp S4 cho 'bar' làm việc trên một thanh 'lớp' S3 là một tai nạn của việc thực hiện, và bạn đang xây dựng một cấu trúc phức tạp trên nền móng rất run rẩy. –