这与以下帖子Problems passing arguments with callNextMethod() in R
有关我正在为两个S4课程编写访问器,' foo'并且' 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"]
对象的访问者&#39; f&#39;上课&#39; foo&#39;正确回报:
> f["x"]
[1] 1
> f["y"]
[1] 2
如果我尝试访问广告位&#39;距离&#39;对象&#39; b&#39;班级&#39;班级&#39;访问者也正确地返回:
> b["distance"]
[1] 5
当我尝试访问对象的任何插槽时出现问题&#39; b&#39;班级&#39;班级&#39;这是继承自&#39; foo&#39;。如果我尝试:
b["x"]
b["y"]
我收到以下错误消息:
Error in callNextMethod() : bad object found as method (class “function”)
我已阅读此帖Problems passing arguments with callNextMethod() in R中的建议,但我无法为&#39; [&#39;并尝试将参数显式传递给callNextMethod()也失败了。
当然我做错了什么!我已经阅读了几个有关遗产的资源,无法确定问题,我希望大家能指导我朝着正确的方向前进。
谢谢
最高
答案 0 :(得分:5)
您的方法都忽略了任何[
方法所要求的五个正式参数之一,即省略号(...
)。
args(getGeneric("["))
# function (x, i, j, ..., drop = TRUE)
# NULL
在两种方法定义中将其作为形式包含可以解决您的问题:
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)
}
}
}
)
b["distance"]
# [1] 5
b["x"]
# [1] 3
b["y"]
# [1] 4