R: перегрузка оператора и Ops.zoo в объекте zoo

#r #zoo

#r #зоопарк

Вопрос:

Как реализовать перегрузку оператора в R (например, , - * , ./ ,,,) для нового класса? Я проверил исходный код библиотеки zoo, в 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. Вы могли бы проверить ?Ops . Этот и S3 методы должны дать вам представление о том, почему это работает.

2. @Nick,спасибо. Я думаю, мне нужно изучить, как работает merge.zoo (reclass= NULL), чтобы полностью понять это.

3. есть ли причина, по которой этому уделяется особое внимание zoo ? (смотрите ответ ниже). У вас есть конкретная необходимость следовать формату Ops.zoo или это просто пример, который вы смогли найти?

4. PS если вам не нужно, чтобы это касалось zoo, вы могли бы вернуться и изменить заголовок на что-то вроде «перегрузка оператора для арифметических операторов ,-, /, *»

5. Эта merge команда записывает свои аргументы обратно в выровненной форме, чтобы их можно было объединить с помощью обычных операторов. Оказывается, что это немного эффективнее, чем возвращать их через возвращаемое значение функции, поскольку не обязательно настраивать единую структуру для хранения их обоих.

Ответ №1:

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

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

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

 ` .Date`
  

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