我正在尝试将自己的S4类视为data.table中的向量。一切顺利,除了当我在data.table中索引行时,我的索引方法不适用于向量。这与data.frame完美配合,但不适用于data.table。
这是我的班级:
setClass('myvector', contains = 'vector', slots = c(foo = 'logical')
它包含一个向量,并在一个槽中有一个并行逻辑向量'foo'。
我创建了一个[
方法,以便将foo槽与包含的向量一起编入索引。
setMethod('[', 'myvector',
function(x, i) {
new('myvector', x@.Data[i], foo = x@foo[i])
})
如果我把这个课程放到data.frame
中,一切都会顺利进行。
mydf <- data.frame(Numbers = new('myvector', 1:26, foo = rep(TRUE, 26)),
Letters = new('myvector', letters, foo = rep(FALSE, 26)))
我可以索引data.frame的行,并且使用我的myvector
方法正确索引每个[
个对象。您可以看到,在mydf[1:10, ]
之后,@foo
向量中的$Numbers
广告位已被编入索引。
mydf[1:10, ]
mydf[1:10, ]$Numbers@foo
但是,如果我使用data.table
尝试相同的操作,则包含的向量会被编入索引,但@foo
不会被编入索引。
library(data.table)
mydt <- data.table(Numbers = new('myvector', 1:26, foo = rep(TRUE, 26)),
Letters = new('myvector', letters, foo = rep(FALSE, 26)))
mydt[1:10, ]
mydt[1:10, ]$Numbers@foo
似乎默认的[.vector
方法应用于data.table
,而不是我的特定myvector
[
方法。有趣的是,@foo
广告位不会消失,Numbers
和Letters
向量各自保留其类,只是@foo
没有被编入索引。
data.table是否总是使用它自己的内置向量索引或什么?我可以做些什么来说服data.table
使用我的[
方法吗?