将多个操作系统的并行或双并行作为CRAN包使用的自定义包

将多个操作系统的并行或双并行作为CRAN包使用的自定义包,r,parallel-processing,cran,R,Parallel Processing,Cran,我正在为R构建一个包,我希望它能够跨平台。我正在Linux下开发,函数mclappy将从parallel包中使用。Windows不支持此软件包(它使用doParallel)。我真的很喜欢parallel软件包,虽然它简单且速度快,但我不知道这是否应该成为为CRAN提供两个不同版本的软件包的原因,用于单独的操作系统(似乎需要额外维护),更不用说它是否被允许 想法 另外,现在我考虑的是并行 mclapply(ldata, function(x), mc.cores=cores) cl <-

我正在为R构建一个包,我希望它能够跨平台。我正在Linux下开发,函数
mclappy
将从
parallel
包中使用。Windows不支持此软件包(它使用
doParallel
)。我真的很喜欢
parallel
软件包,虽然它简单且速度快,但我不知道这是否应该成为为CRAN提供两个不同版本的软件包的原因,用于单独的操作系统(似乎需要额外维护),更不用说它是否被允许

想法

另外,现在我考虑的是并行

mclapply(ldata, function(x), mc.cores=cores)
cl <- makeCluster(cores)
parLapply(cl, ldata, function(x))
等同于双平行

mclapply(ldata, function(x), mc.cores=cores)
cl <- makeCluster(cores)
parLapply(cl, ldata, function(x))

cl首先,
mclappy
parlappy
都在
parallel
包中,尽管
mclappy
在Windows上实际上并不并行运行
parlappy
在所有支持的平台上并行运行,但并不总是像
mclappy
那样高效。
doParallel
包与
foreach
包一起使用,充当
并行
包的适配器

要编写既适用于Windows又适用于非Windows的软件包,您有多种合理的选择:

  • 只要使用
    parlappy
    ,因为它在任何地方都有效
  • 在Windows上使用
    parlappy
    ,在其他地方使用
    mclappy
  • 使用
    doParallel
    foreach
doParallel
软件包很方便,因为它在非Windows平台上使用了
mclappy
。例如:

library(doParallel)
registerDoParallel()
foreach(i=1:10, .options.snow=list(preschedule=TRUE)) %dopar% {
    Sys.sleep(2)
}
这将在Linux和Mac OS X上使用
mclappy
,但会在Windows的后台自动创建PSOCK群集对象。使用
preschedule=TRUE
(添加在
doParallel
1.0.3中)将导致
doParallel
在内部使用
clusterApply
预先安排任务,这与
parlappy
非常相似

请注意,如果显式创建并注册集群对象,则无论平台如何,都不会使用
mclappy
。它可以很好地工作,但可能没有那么有效。要使用
mclappy
,必须使用数字参数调用
registerDoParallel
,或者根本不调用参数


您可以查看
boot
包的源代码,了解如何使用
mclappy
parlappy
的示例,具体取决于您的平台。

为什么不同时使用
parlappy
包中的
parlappy
,因为我认为这是跨平台的(或者我希望是这样,因为我在我的一个软件包中使用了它)。您还可以将
if(){}else{}
Sys.info()[“sysname”]
使用正确的设置。@泰勒·林克,parlappy是否显示每个新脚本的.Rprofile加载?如果是,那么我认为它应该很好,因为它不是fork。
parallel
在windows上受支持,并且可以使用
mclappy
。它只是恢复到串行求值,就像一个简单的
lappy
@MartinMorgan Bu那么这不是期望的回退行为不幸的是。。。