如何定义子集运营商一个S4级?如何定义子集运营商一个S4级?(How to define the s

2019-05-17 12:31发布

我无法找出正确的方式来定义[$ ,和[[子集运营商的S4类。

任何人都可以提供我定义这三个为S4类的一个基本的例子?

Answer 1:

探索通用的,所以我们知道我们的目标

> getGeneric("[")
standardGeneric for "[" defined from package "base"

function (x, i, j, ..., drop = TRUE) 
standardGeneric("[", .Primitive("["))
<bytecode: 0x32e25c8>
<environment: 0x32d7a50>
Methods may be defined for arguments: x, i, j, drop
Use  showMethods("[")  for currently available ones.

定义一个简单的类

setClass("A", representation=representation(slt="numeric"))

和实施方法

setMethod("[", c("A", "integer", "missing", "ANY"),
    ## we won't support subsetting on j; dispatching on 'drop' doesn't
    ## make sense (to me), so in rebellion we'll quietly ignore it.
    function(x, i, j, ..., drop=TRUE)
{
    ## less clever: update slot, return instance
    ## x@slt = x@slt[i]
    ## x
    ## clever: by default initialize is a copy constructor, too
    initialize(x, slt=x@slt[i])
})

在行动:

> a = new("A", slt=1:5)
> a[3:1]
An object of class "A"
Slot "slt":
[1] 3 2 1

有支持的(隐含的)许多签名不同的策略,比如你可能也想支持逻辑和字符索引值,可能是既i和j。 最直接的是一个“正面”的图案,其中每个方法做了一些初步胁迫为通用类型子集索引,例如, integer ,以允许重新排序和索引条目的重复,然后使用callGeneric调用一个方法这确实子集化类的工作。

有用于没有概念上的差异[[比希望尊重所暗示返回内容而不是对象的另一个实例的语义其他[ 。 对于$ ,我们有

> getGeneric("$")
standardGeneric for "$" defined from package "base"

function (x, name) 
standardGeneric("$", .Primitive("$"))
<bytecode: 0x31fce40>
<environment: 0x31f12b8>
Methods may be defined for arguments: x
Use  showMethods("$")  for currently available ones.

setMethod("$", "A",
    function(x, name)
{
    ## 'name' is a character(1)
    slot(x, name)
})

> a$slt
[1] 1 2 3 4 5


Answer 2:

我会做的@Martin_Morgan建议你提到的运营商。 我想补充几点,但:

1)I将是小心有关定义$操作者访问一个S4槽(除非打算从被存储在一个特定的时隙中的数据帧访问的列?)。 一般的建议是写这样的存取函数getMySlot()setMySlot()来获得你所需要的信息。 您可以使用@操作员从这些插槽存取数据,虽然获取和设置是最好的,因为用户界面。 使用$可能是用户,谁可能会想到一个data.frame混乱。 见这个由Christophe Genolini S4教程对这些问题进行了深入的讨论。 如果这不是你打算如何使用$ ,无视我的建议(但本教程仍然是一个巨大的资源!)。

2)如果要定义[[[从另一个类继承,像载体,则还希望定义el()相当于[][[1L]]或从一个子集的第一个元素[]length() 我目前正在写一类,从数字继承和数值方法会自动尝试使用这些功能从你的类。 如果类是比较有限或个人使用,这可能不是一个问题。

我很抱歉,我会离开这个作为一个评论,但我是新来的SO,我没有代表呢!



文章来源: How to define the subset operators for a S4 class?
标签: oop r subset s4