我想定义两个S4类,其中一个包含另一个。低级类有一个特定的槽,比如x
,我需要object@x
根据object
是低级类还是 Package 类而有不同的行为。例如:
setClass("foo",
contains = "numeric",
slots = c(x = "character"))
setClass("bar",
contains = "foo")
ff <- new("foo", 1:10, x = "abc")
bb <- new("bar", ff)
现在,从这里我得到:
> ff@x
[1] "abc"
> bb@x
[1] "abc"
我想要的是在调用bb@x
时,截取"abc"
并修改它,以便bb@x
生成与ff@x
不同的内容。
我尝试为bar
设置自定义@
方法:
setMethod("@", signature(x = "bar"),
function(x, slot) {
out <- x@slot
if (slot == "x") {
out <- toupper(out)
}
out
})
但它失败了,并显示以下错误:
> Error in setGeneric(f, where = where) :
must supply a function skeleton for ‘@’, explicitly or via an existing function
我尝试使用method.skeleton
,但也出现以下错误:
> method.skeleton("@", "bar")
Error in genericForBasic(name) :
methods may not be defined for primitive function ‘@’ in this version of R
还有别的选择吗?
1条答案
按热度按时间icnyk63a1#
在我看来,让
@
根据不同的对象表现不同是一个非常糟糕的设计选择。为什么不创建一个全新的函数,例如
getx
,如下所示: