2012-10-28 21 views
1

可能重复:
S4 Classes: Multiple types per slot一个S4级内使并行集群

我试图让我的第一个R包。 我打算创建一个包含数据和一些处理数据的方法的S4类“测试”。 在我的情况下,数据的处理可以通过多线程来改进。 我测试了parLapply(),它提高了性能。

的问题是,我不想叫:

cl <- makeCluster(N) 
parLapply(cl, x, FUN, ...) 
stopCluster(cl) 
在我要让每个平行方法

。这是因为它不够优雅,我认为,线程成本团队的重复创建(和破坏)。

因此,我正在考虑(简单地)在我的课程“test”中有一个cluster对象。 然后,我可以,例如,做一个“测试”对象“o”,并调用“测试”setNumbrOfThreads(o) <- 4的方法。

但是,我遇到了实施麻烦。由于?makeCluster()状态下的返回值为“” C(‘SOCKcluster’,‘簇’)“‘”’类的对象”,我曾尝试:

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 
    ) 
) 

ř抱怨element 3 of the representation was not a single character string 。 所以我尝试没有更多的成功:cluster = "cluster"cluster = "SOCKcluster"(代表)。

我的问题是:

我如何可以创建一个S4级与C级(“SOCKcluster”,“集群”)的一个成员对象?

谢谢

+0

@BrandonBertelsen谢谢,我会尝试并更新。我在R和OOP方面很难。 –

+0

布兰登问题的解决方案为我工作。这确实是重复的。 –

回答

1

布兰登被问及把对象的不同类型(“苹果”,“橙”)到一个单一的插槽;你正在问在S4对象中使用S3类。符号c("SOCKcluster", "cluster")是S3的说法,SOCKcluster包含cluster作为父类。这是Example of Using an S3 Class in a S4 Object,的重复,而不是S4 Classes: Multiple types per slot,并有一个扭曲 - 你有一个(短)的S3类层次结构,而不仅仅是一个单一的S3类。解决的办法是本着同样的精神,虽然与

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

相关问题