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
)

このクラスに「数値」からメソッドを継承させたいのですが、保存しているチャンクだけでなく、ベクトル全体でこれらのメソッドを使用したいのです。たとえば、「平均」に対して独自のメソッドを定義したくありませんが、「平均」が長さ()、「[」、「[ ['、および私が定義した 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)
}})

「平均」などのメソッドを呼び出そうとすると、関数は正しく継承され、長さ関数にアクセスしますが、.Data スロットにデータが保存されていないため、NA が返されます。.Data スロットを使用してチャンク関数を指す方法、またはすべてのメソッドを自分で定義せずに数値メソッドをチャンクするようにクラスに指示する方法はありますか? 可能であれば、C でのコーディングを避けようとしています。どんなアドバイスもとても役に立ちます!

4

2 に答える 2

0

チャンクスロットを削除して、numericの.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 に答える