1

可能重复:
S4 类:每个插槽多个类型

我正在尝试制作我的第一个 R 包。我计划创建一个 S4 类“测试”,其中包含数据和一些处理数据的方法。就我而言,可以通过多线程来改进数据的处理。我已经测试过parLapply()了,它提高了性能。

问题是我不想打电话:

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

在我想要并行的每种方法中。这是因为它不优雅,而且我认为是线程成本团队的重复创建(和破坏)。

因此,我正在考虑(只是)cluster在我的班级“测试”中有一个对象。然后我可以,例如,制作一个“测试”对象“o”并调用一个“测试”方法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("SOCKcluster", "cluster") 的成员对象创建 S4 类?

谢谢,

4

1 回答 1

1

Brandon 询问将不同类型的对象(“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的副本,并且有所不同——您有一个(短)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.

于 2012-10-29T00:04:29.670 回答