0

我想在 R 中创建一个 S4 类,它允许我从云中访问大型数据集(以块的形式)(类似于 ff 包的目标)。现在我正在使用一个名为“range.vec”的玩具示例(我还不想处理互联网访问),它存储了一个数字序列,如下所示:

setClass("range.vec",
representation(start = "numeric", #beginning num in sequence
end = "numeric",                  #last num in sequence
step = "numeric",                 #step size
chunk = "numeric",                #cache a chunk here to save memory
chunkpos = "numeric"),            #where does the chunk start in the overall vec
contains="numeric"                #inherits methods from numeric
)

我希望这个类从“numeric”继承方法,但我希望它在整个向量上使用这些方法,而不仅仅是我存储的块。例如,我不想为'mean'定义我自己的方法,但我希望'mean'通过使用length()、'['、'[ [' 和我定义的 el() 函数。我还定义了一个分块函数:

setGeneric("set.chunk", function(x,...) standardGeneric("set.chunk"))
setMethod("set.chunk",  signature(x = "range.vec"),
    function (x, chunksize=100, chunkpos=1) {
    #This function extracts a chunk of data from the range.vec object.
    begin <- x@start + (chunkpos - 1)*x@step
    end <- x@start + (chunkpos + chunksize - 2)*x@step
    data <- seq(begin, end, x@step) #calculate values in data chunk

    #get rid of out-of-bounds values
    data[data > x@end] <- NA

    x@chunk <- data
    x@chunkpos <- chunkpos
    return(x)
}})

当我尝试调用像“mean”这样的方法时,该函数会正确继承,并访问我的长度函数,但返回 NA 因为我没有任何数据存储在 .Data 插槽中。有没有一种方法可以使用 .Data 插槽来指向我的分块函数,或者告诉类在不自己定义每个方法的情况下分块数字方法?如果可以的话,我会尽量避免使用 C 进行编码。任何建议都会非常有帮助!

4

2 回答 2

0

您可以删除您的插槽并将其替换为数字的.Data插槽。

小例子:

## class definition
setClass("foo", representation(bar="numeric"), contains="numeric")
setGeneric("set.chunk", function(x, y, z) standardGeneric("set.chunk"))
setMethod("set.chunk",
        signature(x="foo", y="numeric", z="numeric"), 
        function(x, y, z) {
    ## instead of x@chunk you could use numeric's .Data slot
    x@.Data <- y
    x@bar <- z
    return(x)
})

a <- new("foo")

a <- set.chunk(a, 1:10, 4)

mean(a) # 5.5
于 2012-07-06T16:44:13.790 回答
0

看起来在课堂上没有一个好的方法可以做到这一点。我发现的唯一解决方案是告诉用户进行计算以遍历来自云的所有数据块,并在它们进行时进行计算。

于 2012-08-16T14:29:15.100 回答