R: перегрузка оператора и Ops.zoo в объекте зоопарка - PullRequest
2 голосов
/ 30 мая 2011

В 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)}?

1 Ответ

8 голосов
/ 30 мая 2011

Я думаю, что вы, возможно, смотрите на пример, который является более сложным, чем необходимо. Конечно, стоит прочитать ?Ops (как указано выше), но для базовых примеров вы можете сделать это довольно легко:

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

Если что-то простое не соответствует вашим потребностям, я бы предложил (в дополнение к ?Ops) рассмотреть более простой пример, такой как

`+.Date`

(обратите внимание на одинарные кавычки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...