将R S3普通函数转换为通用函数

时间:2017-01-26 23:10:19

标签: r generics roxygen2

仅供参考,看起来此问题已经有LISP equivalent

最近我想为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时选择所需的文件。)

有干净的方法吗?

1 个答案:

答案 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, ])