Мой вопрос:
Почему 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 = x. Фактически это означает, что следующий метод видит те же фактические аргументы, но аргументы оцениваются только один раз.
Мой второй вопрос: как передать другой аргумент следующему методу. (Мне бы очень хотелось сохранить аргументы по умолчанию в обоих методах)
r-devel
... - person Ben Bolker   schedule 25.08.2011