Проблемы с передачей аргументов с callNextMethod () в R

Мой вопрос:

Почему callNextMethod () не передает аргументы как ожидается следующий метод?

Ситуация:

Допустим, у меня есть два иерархических класса foo и bar ( bar является подклассом foo ), для которого у меня есть метод foobar , который может выполнять диспетчеризацию для обоих классов (т. Е. Имеет методы для обоих классов).

Кроме того, метод для (под) класса bar вызывает метод для foo после некоторых вычислений с callNextMethod () .

Оба метода имеют один и тот же дополнительный аргумент (по умолчанию), который должен быть передан методу для foo , где важен только он.

setClass("foo", representation(x = "numeric"))
setClass("bar", contains = "foo")

setGeneric("foobar", function(object, ...) standardGeneric("foobar"))

setMethod("foobar", "foo", function(object, another.argument = FALSE, ...) {
    print(paste("in foo-method:", another.argument))
    if (another.argument) object@x^3
    else object@x^2
})

setMethod("foobar", "bar", function(object, another.argument = FALSE, ...) {
    print(paste("in bar-method:", another.argument))
     object@x <- sqrt(object@x)
    callNextMethod()
})

Описание проблемы:
Аргументы не передаются должным образом, но значения по умолчанию берутся из определения метода. В частности, в первом методе аргумент такой, как указано в вызове ( TRUE ), однако он изменяется на FALSE в следующем методе.

o1 <- new("bar", x = 4)

foobar(o1, another.argument = TRUE)

дает

[1] "in bar-method: TRUE"
[1] "in foo-method: FALSE"
[1] 4

Я хочу, чтобы another.argument передавался следующему методу, чтобы он был TRUE в вызове метода foo , тоже.


Из ? CallNextMethod я понял, что он должен работать, как ожидалось (т. Е. Именованный аргумент передается так, как он есть в вызове):

Для формального аргумента, скажем x, который появляется в оригинальный звонок, там - соответствующий аргумент в следующем вызове метода, эквивалентный x = Икс. Фактически это означает, что следующий метод видит то же самое аргументы, но аргументы оцениваются только один раз.


Мой второй вопрос : Как я могу передать другой аргумент следующему методу. (Я бы очень хотел сохранить аргументы по умолчанию в обоих методах)

7
задан Henrik 25 August 2011 в 13:47
поделиться