【发布时间】:2014-09-12 13:25:56
【问题描述】:
这与下面的帖子Problems passing arguments with callNextMethod() in R有关
我正在为两个 S4 类“foo”和“bar”编写访问器。 'bar' 继承自 foo 并且仅扩展了几个插槽。我不想为类“bar”的对象编写完整的访问器函数,而是在访问由“foo”继承的插槽时将参数传递给 callNextMethod()。我的代码如下所示:
foo <- setClass("foo", representation(x = "numeric", y = "numeric"))
bar <- setClass("bar", representation(distance = "numeric"), contains = "foo")
setMethod("[", "bar", function(x, i, j, drop) {
if (i == "distance") {
return(x@distance)
} else {
callNextMethod()
}
}
)
setMethod("[", "foo", function(x, i, j, drop) {
if (i == "x") {
return(x@x)
} else {
if (i == "y") {
return(x@y)
}
}
}
)
现在让我们试试这个:
f <- new("foo", x = 1, y = 2)
b <- new("bar", x = 3, y = 4, distance = 5)
f["x"]
f["y"]
类 'foo' 的对象 'f' 的访问器正确返回:
> f["x"]
[1] 1
> f["y"]
[1] 2
如果我尝试访问类“bar”的对象“b”的槽“距离”,访问器也会正确返回:
> b["distance"]
[1] 5
当我尝试访问从 'foo' 继承的类 'bar' 的对象 'b' 的任何插槽时,就会出现问题。如果我尝试:
b["x"]
b["y"]
我收到以下错误消息:
Error in callNextMethod() : bad object found as method (class “function”)
我已阅读这篇文章 Problems passing arguments with callNextMethod() in R 的建议,但我无法为 '[' 定义泛型,并且尝试将参数显式传递给 callNextMethod() 也失败了。
我肯定做错了什么!我已经阅读了一些关于继承的资源,但无法确定问题所在,希望你们能够指导我走向正确的方向。
谢谢
最大
【问题讨论】:
-
通过查看
callNextMethod的源代码,我知道“为什么”它不起作用,但考虑到您在这里的内容,我不知道为什么它不起作用。好问题!
标签: r inheritance argument-passing s4