Почему 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 = Икс. Фактически это означает, что следующий метод видит то же самое аргументы, но аргументы оцениваются только один раз.
Мой второй вопрос : Как я могу передать другой аргумент следующему методу. (Я бы очень хотел сохранить аргументы по умолчанию в обоих методах)