我正在尝试制作我的第一个R包。
我计划创建一个S4类“测试”,其中包含数据和一些处理数据的方法。
就我而言,可以通过多线程改进数据处理。
我测试了parLapply()
,它提高了性能。
问题在于我不想打电话:
cl <- makeCluster(N)
parLapply(cl, x, FUN, ...)
stopCluster(cl)
在每个我希望并行的方法中。这是因为它不优雅,并且我认为,线程成本团队的重复创建(和破坏)。
因此,我正在思考(简单地)在我的班级“测试”中有一个cluster
对象。
然后我可以,例如,制作一个“测试”对象“o”并调用“test”方法setNumbrOfThreads(o) <- 4
。
但是,我在执行方面遇到了麻烦。由于?makeCluster()
表示返回值是'''类'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类成员对象的S4类(“SOCKcluster”,“cluster”)?
谢谢,
答案 0 :(得分:1)
布兰登询问将不同类型的物品('apple','orange')放入一个槽中;你问的是在S4对象中使用S3类。符号c("SOCKcluster", "cluster")
是S3表示SOCKcluster
包含cluster
作为父类的方式。这是Example of Using an S3 Class in a S4 Object的S4 Classes: Multiple types per slot,而不是的{{3}}的副本,并且有一个扭曲 - 你有一个(短)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群集(需要snow
和Rmpi
)放入您的类失败
> 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
。