Cách tốt nhất để xác định một chức năng mục đích chung nào cần thực hiện cho cả hai lớp S3 và S4? Tôi đã sử dụng một cái gì đó như thế này:Kết hợp các phương pháp S4 và S3 trong một hàm duy nhất
setGeneric("myfun", function(x, ...){
standardGeneric("myfun");
});
setMethod("myfun", "ANY", function(x, ...) {
if(!isS4(x)) {
return(UseMethod("myfun"));
}
stop("No implementation found for class: ", class(x));
});
này thành công:
myfun.bar <- function(x, ...){
return("Object of class bar successfully dispatched.");
}
object <- structure(123, class=c("foo", "bar"));
myfun(object)
Có một động thái cách "tự nhiên" để thực hiện điều này? Tôi biết chúng ta có thể định nghĩa các phương thức S4 cho các lớp S3 bằng cách sử dụng setOldClass
, tuy nhiên theo cách này chúng ta mất phương thức S3 gửi đi trong trường hợp một đối tượng có nhiều lớp. Ví dụ. (Trong một phiên sạch):
setGeneric("myfun", function(x, ...){
standardGeneric("myfun");
});
setOldClass("bar")
setMethod("myfun", "bar", function(x, ...){
return("Object of class bar successfully dispatched.");
});
object <- structure(123, class=c("foo", "bar"));
myfun(object)
này sai vì lớp thứ hai của object
, trong trường hợp này bar
, được bỏ qua. Chúng tôi có thể sửa lỗi này bằng cách xác định thừa kế S4 chính thức giữa foo
và bar
, nhưng đối với ứng dụng của tôi, tôi muốn có myfun.bar
để làm việc ra khỏi hộp trên đối tượng S3 với lớp bar
.
Dù bằng cách nào, mọi thứ đang trở nên lộn xộn, và tôi đoán đây là một vấn đề phổ biến, vì vậy có lẽ cách tốt hơn để làm điều này?
Xem thêm http://stackoverflow.com/questions/12709933/adding-s4-dispatch-to-base-r-s3-generic cho trường hợp đặc biệt thêm công văn S4 vào chung S3 trong cơ sở R. –