你可以让`table`表现得像通用函数一样吗?

时间:2018-01-30 16:52:22

标签: r generics

假设我有一个来自班级x的对象foo(代表一些区间):

x <- c("0;100", "0;20", "10;40", "10;40")
attr(x, "class") <- "foo"

table(x)按字母顺序排列x元素:

0;100  0;20 10;40 
    1     1     2 

但我默认情况下,更愿意根据间隔的长度订购x。我期待

table.foo <- function(x, ...) table(unclass(x), ...)[c(2, 3, 1)]
# or the sake of simplicity the way to find the ordering is not shown

导致

table.foo(x)
0;20 10;40 0;100 
   1     2     1 

会做这个工作。不幸的是,据我所知,table不是通用函数(与例如plot相反),因此运行table(x)不会调用table.foo(x)有没有办法让表格通用或更通用:创建一个将被调用而不是table的函数?我试过setGeneric("table", table.foo)但似乎不是我的希望:首先,它产生无限递归,因为table.foo将在每种情况下被调用,即使传递给table的对象不属于类foo,其次,它似乎是table的局部效果(在运行代码的计算机上),但不是table.foo的一般效果,应由包分发。

1 个答案:

答案 0 :(得分:0)

@duckmayr提供的first link to an answer on a different question(链接和回答)解决了这个问题。所以这里是来自@ duckmayr的答案很难修改的代码:

#' My new table function
#'
#' My new table function able to handle objects of class foo.
#'
#' @param x an object
#' @param ... other arguments
#'
#' @rdname table
#' @export
table <- function(x, ...) {
    UseMethod('table', x)
}

#' @rdname table
#' @export
table.foo <- function(x, ...) {
    table(unclass(x), ...)[c(2, 3, 1)]
}

#' @rdname table
#' @export
table.default <- function(x, ...) {
    return(base::table(x, ...))
}