将 R S3 普通函数转换为通用函数
Turning an R S3 ordinary function into a generic
仅供参考,看起来这个问题已经有了 。
最近我想为 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 函数竞争(当你 运行 ?setdiff
时,R 会要求你选择你想要的一个)。
有干净的方法吗?
可以使用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, ])
仅供参考,看起来这个问题已经有了
最近我想为 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 函数竞争(当你 运行 ?setdiff
时,R 会要求你选择你想要的一个)。
有干净的方法吗?
可以使用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, ])