2012-10-03 30 views
6

Tôi đang cố thêm phương thức không gian vào merge cần phải là S4 (vì nó gửi đi trên hai loại đối tượng khác nhau).Thêm S4 gửi đến cơ sở R S3 chung

Tôi đã cố gắng sử dụng một earlier solution như sau:

#' Merge a SpatialPolygonsDataFrame with a data.frame 
#' @param SPDF A SpatialPolygonsDataFrame 
#' @param df A data.frame 
#' @param \dots Parameters to pass to merge.data.frame 
#' 
#' @export 
#' @docType methods 
#' @rdname merge-methods 
setGeneric("merge", function(SPDF, df, ...){ 
    cat("generic dispatch\n") 
    standardGeneric("merge") 
}) 
#' @rdname merge-methods 
#' @aliases merge,SpatialPolygonsDataFrame,data.frame-method 
setMethod("merge",c("SpatialPolygonsDataFrame","data.frame"), function(SPDF,df,...) { 
    cat("method dispatch\n") 
}) 

nào làm việc:

x <- 1 
class(x) <- "SpatialPolygonsDataFrame" 
y <- data.frame() 
> merge(x,y) 
generic dispatch 
method dispatch 

Bạn sẽ phải tin tưởng tôi rằng nếu x thực sự là một SPDF thay vì một giả mạo một, rằng nó không trả lại lỗi khe mà bạn nhận được nếu bạn thực sự chạy mã đó (hoặc không, và chỉ sử dụng chung chung nhiều hơn cho phép dưới đây mà không trả lại lỗi). SPDF là một nỗi đau để tạo ra.

Vấn đề là nó dường như đã bị ghi đè S3 văn:

> merge(y,y) 
generic dispatch 
Error in function (classes, fdef, mtable) : 
    unable to find an inherited method for function "merge", for signature "data.frame", "data.frame" 

Làm thế nào để tránh điều đó? Tôi đã cố gắng loại bỏ các định nghĩa chức năng từ setGeneric để nó chỉ đơn giản là đọc setGeneric("merge") nhưng điều đó không hoạt động hoặc. Tôi có cần nhập bằng cách nào đó nhập merge S3 chung từ base không?

Trả lời

6

Công văn sai xảy ra vì nội dung của chung không phải là "chuẩn" (tôi nghĩ lý do là vì bạn đã làm điều gì khác hơn là gọi standardGeneric("merge"), bạn biết mình đang làm gì để không mặc định tự động ; có lẽ tôi đang làm điều này và nó thực sự là một lỗi). Giải pháp là để thiết lập một generic tiêu chuẩn cho phép các công văn mặc định

setGeneric("merge") 

hoặc để cung cấp một cách rõ ràng văn tiêu chuẩn

setGeneric("merge", function(x, y, ...) standardGeneric("merge")) 

hoặc chỉ định rõ một phương pháp mặc định

setGeneric("merge", function(x, y, ...){ 
    cat("generic dispatch\n") 
    standardGeneric("merge") 
}, useAsDefault=base::merge) 
+0

Trong số đó, chỉ có ba làm việc cho tôi. Việc đầu tiên tôi đã thực sự nhận được như là một ví dụ trong câu hỏi của tôi. Nhưng công trình thứ ba rất xuất sắc. –