문제

공간적 방법을 추가하려고합니다. merge 이는 S4여야 합니다(두 개의 서로 다른 객체 유형을 전달하므로).

나는 이전 솔루션 다음과 같이:

#' 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")
})

어느 것이 작동합니까?

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

x가 위조된 코드가 아닌 실제로 SPDF인 경우 해당 코드를 실제로 실행하면(또는 실행하지 않고 그냥 아래에서는 오류를 반환하지 않는 더 관대한 일반).SPDF는 작성하기가 어렵습니다.

문제는 S3 디스패치를 ​​덮어쓴 것 같다는 것입니다.

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

그것을 어떻게 피합니까?나는 함수 정의를 제거하려고 시도했습니다. setGeneric 그래서 그냥 읽힌다. setGeneric("merge") 하지만 그것도 작동하지 않습니다.어떻게든 가져와야 합니까? merge S3 일반 base?

도움이 되었습니까?

해결책

잘못된 디스패치는 일반 본문이 "표준"이 아니기 때문에 발생합니다. standardGeneric("merge"), 당신은 당신이 무엇을 하고 있는지 알고 있으므로 자동 기본값은 없습니다.어쩌면 내가 이것을 만들어내는 중이고 실제로는 버그일 수도 있습니다.)솔루션은 기본 디스패치를 ​​허용하는 표준 일반을 설정하는 것입니다.

setGeneric("merge")

또는 표준 파견을 명시적으로 제공하기 위해

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

또는 기본 방법을 명시적으로 지정

setGeneric("merge", function(x, y, ...){
  cat("generic dispatch\n")
  standardGeneric("merge")
}, useAsDefault=base::merge)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top