我无法找出正确的方式来定义[
, $
,和[[
子集运营商的S4类。
任何人都可以提供我定义这三个为S4类的一个基本的例子?
我无法找出正确的方式来定义[
, $
,和[[
子集运营商的S4类。
任何人都可以提供我定义这三个为S4类的一个基本的例子?
探索通用的,所以我们知道我们的目标
> 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
我会做的@Martin_Morgan建议你提到的运营商。 我想补充几点,但:
1)I将是小心有关定义$
操作者访问一个S4槽(除非打算从被存储在一个特定的时隙中的数据帧访问的列?)。 一般的建议是写这样的存取函数getMySlot()
和setMySlot()
来获得你所需要的信息。 您可以使用@
操作员从这些插槽存取数据,虽然获取和设置是最好的,因为用户界面。 使用$
可能是用户,谁可能会想到一个data.frame混乱。 见这个由Christophe Genolini S4教程对这些问题进行了深入的讨论。 如果这不是你打算如何使用$
,无视我的建议(但本教程仍然是一个巨大的资源!)。
2)如果要定义[
和[[
从另一个类继承,像载体,则还希望定义el()
相当于[][[1L]]
或从一个子集的第一个元素[]
和length()
我目前正在写一类,从数字继承和数值方法会自动尝试使用这些功能从你的类。 如果类是比较有限或个人使用,这可能不是一个问题。
我很抱歉,我会离开这个作为一个评论,但我是新来的SO,我没有代表呢!