我想在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"中的方法,但我希望它在整个向量上使用这些方法,而不仅仅是我存储的块。例如,我不想为自己的方法定义自己的方法,但我想要的意思是'意思是'通过chunk访问它,使用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)
}})
当我尝试调用类似&#39; mean&#39;的方法时,该函数继承正确,并访问我的长度函数,但返回NA,因为我没有任何数据存储在.Data插槽中。有没有办法可以使用.Data槽指向我的分块函数,或者告诉类块块数值方法而不自己定义每个方法?如果可以的话,我试图避免在C中编码。任何建议都会非常有用!
答案 0 :(得分: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
答案 1 :(得分:0)
在课堂上看起来没有好办法。我发现的唯一解决方案是告诉用户计算循环遍历云中的所有数据块,然后进行计算。