将C ++包库传递给doParallel群集

时间:2013-08-14 15:45:11

标签: r plyr

我有一些plyr代码,用于运行我写过的Rcpp函数:

nodes = detectCores()
cl = makeCluster(nodes)
registerDoParallel(cl)

l = llply(mylist, function(x) {
 .Call("myfancyfunction", PACKAGE = "mypackage", ...)
}, .parallel = TRUE, .paropts = list(.packages = "mypackage")) 

但是,即使我包含该包,我也会收到错误:

Error in do.ply(i) : 
  task 1 failed - ""myfancyfunction" not available for .Call() for package "mypackage""

如何让我的库可供并行进程访问?

1 个答案:

答案 0 :(得分:0)

错误并不表示plyr或并行处理有任何问题;这意味着您没有在包中正确注册C / C ++例程。例如,这有效:

library(plyr)
library(doParallel)
nodes = detectCores()
cl = makeCluster(nodes)
registerDoParallel(cl)
l <- llply(list(1,2), function(x) {
  .Call("endpoints", 1L, 1L, 1L, TRUE, PACKAGE="xts")
}, .parallel=TRUE, .paropts=list(.packages="xts"))
正常R会话中的

library(mypackage); .Call("myfancyfunction", x, PACKAGE="mypackage")可能会引发相同的错误。

请参阅编写R扩展程序中的Registering native routines,了解有关注册myfancyfunction的方法的详细信息。