在R中使用callNextMethod()传递参数时出现问题
我的问题:
为什么callNextMethod()
不会像预期的那样将参数传递给下一个方法?
情况:
假设我有两个分层类foo
和bar
( bar
是foo
子类),为此我有一个可以为两个类分派的方法foobar
(即,两个类都有方法)。
此外,(子)类bar
的方法在用callNextMethod()
进行一些计算后调用foo
的方法。
这两个方法都有相同的附加参数(默认值),应该传递给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
传递给下一个方法,以便在调用foo
方法时也是TRUE
。
从?callNextMethod
我得到它应该如预期的那样工作(即,命名参数被传递,因为它在调用中):
对于一个正式的参数,例如x,出现在原始调用中,下一个方法调用中会有一个对应的参数,等同于x = x。 实际上,这意味着下一个方法会看到相同的实际参数,但参数只会被计算一次。
我的第二个问题 :我怎样才能将另一个参数传递给下一个方法。 (我真的想在这两种方法中保留默认参数)
我认为这与具有与泛型不同的签名的方法被定义(在函数.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, ...)
})
链接地址: http://www.djcxy.com/p/54621.html