假设我有一个来自班级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
的一般效果,应由包分发。
答案 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, ...))
}