为什么callNextMethod()不按预期将参数传递给下一个方法?
假设我有两个分层类foo和bar(bar是它的子类foo),我有一个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()
})
Run Code Online (Sandbox Code Playgroud)
问题描述:
参数未按预期传递,但默认值取自方法定义.具体来说,在第一种方法中,参数是在call(TRUE)中指定的,但是,它会FALSE在下一个方法中更改.
o1 <- new("bar", …Run Code Online (Sandbox Code Playgroud) 这是在R中的访问器函数中使用callNextMethod()的扩展.
更新2017-03-25:为了说明这在加载方法时如何失败,而不是在构建的包中,我创建了一个虚拟包:https://github.com/zkamvar/inheritest#readme
我有一个继承另一个类foo的类栏,它们都有[method]的附加参数.foo的方法一致,但是第一次使用后bar的方法失败了.
Error in callNextMethod(x, i, j, ..., drop): bad object found as method (class "function")
4: stop(gettextf("bad object found as method (class %s)", dQuote(class(method))),
domain = NA)
3: callNextMethod(x, i, j, ..., drop) at #9
2: .local(x, i, j, ..., drop = drop)
1: BAR["x"]
Run Code Online (Sandbox Code Playgroud)
我有一个包实现了一个依赖于另一个包中的类的类.构建包时,一切正常,但是当我的包被简单地加载(使用devtools::load_all("."))时,我得到下面的行为.
foo <- setClass("foo", representation(x = "numeric", y = "numeric"))
bar <- setClass("bar", representation(distance = "numeric"), contains = "foo")
setMethod(f = "[", …Run Code Online (Sandbox Code Playgroud)