2011-05-30 66 views
2

在R中,如何實現運算符重載(如+,-,*,./)爲一個新類?我檢查了動物園圖書館的源代碼,在ops.R。下面的代碼是否可以完成這項工作?R:運算符重載和動物園對象中的Ops.zoo

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) 

測試,但隨後testNULLe <- {test; NextMethod(.Generic)}如何工作?

+0

你可以檢查'?Ops'。這和S3方法應該給你一個爲什麼這個工程的處理。 – 2011-05-30 14:58:17

+0

@ Nick,謝謝。我想我需要研究merge.zoo(reclass = NULL)如何完全理解這一點。 – ahala 2011-05-30 15:33:21

+0

是否有一個原因集中在'動物園'? (見下面的答案)。你是否有特定的需要遵循'Ops.zoo'的格式,或者這只是你能找到的例子? – 2011-05-30 20:01:17

回答

8

我想你可能正在看一個比必要更復雜的例子。這看來確實值得一讀?Ops(作爲評議如上所述),但基本的例子,你可以做到這一點很容易地:

> `+.mychar` <- function(e1,e2) paste(e1,e2) 
> x <- "a" 
> y <- "b" 
> class(x) <- "mychar" 
> x+y 
[1] "a b" 

如果簡單的不能滿足您的需要的東西,我建議(除了?Ops )看一個簡單的例子像

`+.Date` 

(注意向後單引號)

+0

(+1)不錯的插圖。 – chl 2011-05-30 21:59:32