1

重複の可能性:
S4 クラス: スロットごとに複数のタイプ

初めての R パッケージを作ろうとしています。データとデータを処理するいくつかのメソッドを含む S4 クラス「テスト」を作成する予定です。私の場合、データの処理はマルチスレッドによって改善できます。テストparLapply()しましたが、パフォーマンスが向上します。

問題は、私が電話したくないということです:

cl <- makeCluster(N)
parLapply(cl, x, FUN, ...)
stopCluster(cl)

並列にしたい各メソッドで。これは、エレガントではなく、スレッドのチームの作成 (および破棄) の繰り返しにコストがかかるためです。

clusterしたがって、クラス「テスト」内に(単に)オブジェクトを持つことを考えていました。次に、たとえば、「テスト」オブジェクト「o」を作成し、「テスト」のメソッドを呼び出すことができますsetNumbrOfThreads(o) <- 4

ただし、実装に問題があります。?makeCluster()戻り値は '''An object of class 'c("SOCKcluster", "cluster")''' であると述べているので、試してみました:

setClass("test",
    representation(
        data = "list",
        nThreads = "numeric",
        cluster = c("SOCKcluster", "cluster") #This seems incorrect
    ),
    prototype(
        data = NULL,
        nThreads = 1,
        cluster = makeCluster(1) # "cluster = NULL" does not help
    )
) 

Rはそれを不平を言ったelement 3 of the representation was not a single character string 。だから私はそれ以上成功せずに試しました:cluster = "cluster"またはcluster = "SOCKcluster"(表現で)。

私の質問は:

クラス c("SOCKcluster", "cluster") のメンバーオブジェクトを持つ S4 クラスを作成するにはどうすればよいですか?

ありがとうございました、

4

1 に答える 1

1

ブランドンは、さまざまな種類のオブジェクト (「リンゴ」、「オレンジ」) を 1 つのスロットに入れることについて尋ねました。S4 オブジェクトで S3 クラスを使用することについて質問しています。表記は、 containsを親クラスc("SOCKcluster", "cluster")とする S3 の言い方です。これは、 S4 クラスではなくS4 オブジェクトでの S3 クラスの使用例 の複製です: スロットごとに複数のタイプ、ひねりを加えたものです -- 単一の S3 クラスだけでなく、(短い) S3 クラス階層があります。ただし、解決策は同じ精神にあります。SOCKclustercluster

setOldClass(c("SOCKcluster", "cluster"))
A = setClass("A", representation(cluster="SOCKcluster"))

その後

> library(parallel)
> a = A(cluster=makePSOCKcluster(2))
> a
An object of class "A"
Slot "cluster":
socket cluster with 2 nodes on host 'localhost'

クラスに MPI クラスター ( と が必要) を配置しようとするsnowRmpi失敗する

> a = A(cluster=makeCluster(2, "MPI"))
    2 slaves are spawned successfully. 0 failed.
Error in validObject(.Object) : 
  invalid class "A" object: 1: invalid object for slot "cluster" in class "A": got class "spawnedMPIcluster", should be or extend class "SOCKcluster"
invalid class "A" object: 2: invalid object for slot "cluster" in class "A": got class "MPIcluster", should be or extend class "SOCKcluster"
invalid class "A" object: 3: invalid object for slot "cluster" in class "A": got class "cluster", should be or extend class "SOCKcluster"

をサポートするクラスを作成するにclusterは、?setOldClass.

于 2012-10-29T00:04:29.670 に答える