在R中,如何为新类实现运算符重载(如+
,-
,*
,./
)?我在ops.R
中检查了动物园图书馆的源代码。以下代码是否可以完成这项工作?
Ops.zoo <- function (e1, e2)
{
e <- if (missing(e2)) {
NextMethod(.Generic)
}
else if (any(nchar(.Method) == 0)) {
NextMethod(.Generic)
}
else {
merge(e1, e2, all = FALSE, retclass = NULL)
NextMethod(.Generic)
}
out <- if (is.null(attr(e, "index")))
zoo(e, index(e1), attr(e1, "frequency"))
else
e
# the next statement is a workaround for a bu g in R
structure(out, class = class(out))
}
我迷失在merge(e1,e2,..)
街区。我用
e1 <- zoo(rnorm(5), as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-")))
e2 <- e1
test <- merge(e1, e2, all = FALSE, retclass = NULL)
但test
为NULL
。 e <- {test; NextMethod(.Generic)}
如何运作?
答案 0 :(得分:8)
我想你可能正在看一个比必要更复杂的例子。它当然值得阅读?Ops
(正如上述评论者所说),但对于基本的例子,你可以很容易地做到这一点:
> `+.mychar` <- function(e1,e2) paste(e1,e2)
> x <- "a"
> y <- "b"
> class(x) <- "mychar"
> x+y
[1] "a b"
如果某些简单的东西不符合您的需求,我建议(除?Ops
之外)查看更简单的示例,如
`+.Date`
(注意向后单引号)