Problemas que pasan argumentos con callNextMethod () en R
Por que escallNextMethod()
no pasa argumentos como se esperaba al siguiente método?
Di que tengo dos clases jerárquicasfoo
ybar
(bar
es una subclase defoo
) para el cual tengo un métodofoobar
que puede despachar para ambas clases (es decir, tiene métodos para ambas clases).
Además, el método para la (sub) clasebar
llama al método parafoo
después de algunos cálculos concallNextMethod()
.
mbos métodos tienen el mismo argumento adicional (con el valor predeterminado) que se debe pasar al método parafoo
, donde solo es 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()
})
Descripción del problema
Los argumentos no se pasan como se esperaba, pero los valores predeterminados se toman de la definición del método. Específicamente, en el primer método, el argumento es el especificado en la llamada TRUE
), sin embargo, cambia aFALSE
en el siguiente 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
Quiero elanother.argument
para pasar al siguiente método para que seaTRUE
en la llamada a lafoo
método, también.
Desde?callNextMethod
Entiendo que debería funcionar como se esperaba (es decir, el argumento nombrado se pasa como está en la llamada):
Para un argumento formal, digamos x, que aparece en la llamada original, hay un argumento correspondiente en la siguiente llamada al método equivalente a x = x. En efecto, esto significa que el siguiente método ve los mismos argumentos reales, pero los argumentos se evalúan solo una vez.
Mi segunda pregunta: ¿Cómo puedo pasar otro argumento al siguiente método? (Realmente me gustaría mantener los argumentos predeterminados en ambos métodos)