Problemas que passam argumentos com callNextMethod () em R
Por que écallNextMethod()
não passando argumentos conforme o esperado para o próximo métod
Digo eu tenho duas classes hierárquicasfoo
ebar
(bar
é subclasse defoo
) para o qual eu tenho um métodofoobar
que pode ser despachado para ambas as classes (ou seja, possui métodos para ambas as classes
Além disso, o método para a (sub) classebar
chama o método parafoo
após alguns cálculos comcallNextMethod()
.
Ambos os métodos têm o mesmo argumento adicional (com padrão) que deve ser passado ao método parafoo
, onde somente isso é relevante.
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()
})
Descrição do Problema
Os argumentos não são passados conforme o esperado, mas os valores padrão são obtidos da definição do método. Especificamente, no primeiro método, o argumento é o especificado na chamada TRUE
), no entanto, muda paraFALSE
no próximo método.
o1 <- new("bar", x = 4)
foobar(o1, another.argument = TRUE)
dá
[1] "in bar-method: TRUE"
[1] "in foo-method: FALSE"
[1] 4
Eu quero oanother.argument
a ser passado para o próximo método para que sejaTRUE
na chamada para ofoo
método também.
A partir de?callNextMethod
Eu entendo que ele deve funcionar conforme o esperado (ou seja, o argumento nomeado é passado como na chamada):
Para um argumento formal, digamos x, que aparece na chamada original, há um argumento correspondente na próxima chamada de método equivalente a x = x. Com efeito, isso significa que o próximo método vê os mesmos argumentos reais, mas os argumentos são avaliados apenas uma ve
inha segunda pergunta: Como posso passar outro argumento para o próximo método. (Eu realmente gostaria de manter os argumentos padrão nos dois métodos)