2017-01-26 74 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, ])