2017-01-26 3 views
1

참고로 전환하면이 질문에 이미 LISP equivalent이 표시되어있는 것으로 보입니다.R S3 일반 기능을 일반

최근에 나는 R베이스 함수 setdiff에 대한 데이터 프레임 확장을 만들고 싶었고 제네릭이 좋을 것이라고 생각했습니다. 다음은 작동하지만 어색해집니다 :

#' @export setdiff.default 
setdiff.default <- setdiff 

#' @export 
setdiff <- function(x, ...) { 
    UseMethod("setdiff") 
} 
#' @export 
setdiff.data.frame <- function(A, B) { 
    A[!duplicated(rbind(B, A))[nrow(B) + 1:nrow(A)], ] 
} 

패키지를로드하면 기본 기능이 마스킹됩니다. 새 함수에 대한 추가 설명서를 작성하면 다른 .Rd 파일이 만들어지고 원래 기본 R 함수와 경쟁합니다 (R은 ?setdiff을 실행할 때 원하는 것을 선택하도록 요청합니다).

깨끗한 방법이 있습니까?

+0

내가 문제를 볼 수 없습니다. 도움말 색인이 마스크 기능 도움말 페이지를 보여줄 때 "좋은 점"이라고 생각합니다. '? setMethod' 아래에서 옵션을 보셨습니까? –

+0

그래, 내가 너무 많이 요구할 수도있다. 기본 메서드를 새로운 제네릭과 "병합"하는 방법을 기대했습니다. –

답변

4

S4를 사용하여 수행 할 수 있습니다. setdiff 인수로 x와 y를 사용합니다 그래서 방법도 수행해야합니다

setGeneric("setdiff") 

setdiff.data.frame <- function(x, y) { 
    x[!duplicated(rbind(y, x))[nrow(y) + 1:nrow(x)], ] 
} 
setMethod("setdiff", signature("data.frame", "data.frame"), setdiff.data.frame) 

# test 
setdiff(BOD[1:3, ], BOD[2:4, ])