R语言 我可以为类定义S4访问器“@”custom吗?

kr98yfug  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(152)

我想定义两个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

还有别的选择吗?

icnyk63a

icnyk63a1#

在我看来,让@根据不同的对象表现不同是一个非常糟糕的设计选择。
为什么不创建一个全新的函数,例如getx,如下所示:

setGeneric("getx", function(object) standardGeneric("getx"))
setMethod("getx", "foo", function(object) object@x)
setMethod("getx", "bar", function(object) toupper(object@x))

# test drive
getx(ff) # abc
getx(bb) # ABC

相关问题