gpt4 book ai didi

oop - 在 R 中使用 callNextMethod() 传递参数的问题

转载 作者:行者123 更新时间:2023-12-04 12:36:30 25 4
gpt4 key购买 nike

我的问题:
为什么是 callNextMethod()没有按预期将参数传递给下一个方法?
情况:
假设我有两个层次类 foobar ( barfoo 的子类)我有一个方法 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我知道它应该按预期工作(即,命名参数在调用中传递):

For a formal argument, say x, that appears in the original call, thereis a corresponding argument in the next method call equivalent to x =x. In effect, this means that the next method sees the same actualarguments, but arguments are evaluated only once.



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

最佳答案

我认为这与定义签名与泛型不同的方法的方式有关(在函数.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, ...)
})

关于oop - 在 R 中使用 callNextMethod() 传递参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7190697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com