7

我的问题:

为什么callNextMethod()没有按预期将参数传递给下一个方法?

情况:

假设我有两个分层类foobarbar是 的子类foo),我有一个foobar可以为这两个类分派的方法(即,两个类都有方法)。

此外,(子)类的方法在一些计算之后bar调用方法。foocallNextMethod()

两种方法都有相同的附加参数(默认),应该传递给 for 的方法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。实际上,这意味着下一个方法看到相同的实际参数,但参数只计算一次。


我的第二个问题:如何将 another.argument 传递给下一个方法。(我真的很想在这两种方法中保留默认参数)

4

1 回答 1

4

我认为这与定义签名与泛型不同的方法的方式有关(在函数.local中)

> selectMethod(foobar, "bar")
Method Definition:

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

Signatures:
        object
target  "bar" 

defined "bar" 

解决方法是定义泛型和方法以具有相同的签名

setGeneric("foobar",
    function(object, another.argument=FALSE, ...) standardGeneric("foobar"),
    signature="object")

或将参数显式传递给callNextMethod

setMethod("foobar", "bar", function(object, another.argument = FALSE, ...) {
    print(paste("in bar-method:", another.argument))
     object@x <- sqrt(object@x)
    callNextMethod(object, another.argument, ...)
})
于 2011-08-25T15:43:48.630 回答