首先我要说的是我读过写R扩展,Rcpp包的插图,以及我已经构建了一个包Rcpp.package.skeleton().
自从构建我的包之后,我添加了一个函数,multiGenerateCSVrow()然后compileAttributes()在R CMD build/R CMD安装之前在包目录上运行.之后予加载我包,我可以直接地或通过运行我功能foreach()与%do%方法.
当我尝试并行运行时,我收到一个错误:
cl <- makePSOCKcluster(8)                                                                                     
registerDoParallel(cl)                                                                                        
rows <- foreach(i=1:8,.combine=rbind,.packages="myPackage") %dopar% multiGenerateCSVrow(scoreMatrix=NIsample,   
                                                                   validMatrix = matrix(1,nrow=10,ncol=10),   
                                                                   cutoffVector = rep(0,10),                  
                                                                   factorVector = randomsCutPlus1[i,],        
                                                                   actualVector = rep(1,10),                  
                                                                   scaleSample = 1)                           
stopCluster(cl)                                                                                               
~                                                                                                             
Error in multiGenerateCSVrow(scoreMatrix = NIsample, validMatrix = matrix(1,  : 
  task 1 failed - "NULL value passed as symbol address"
这是NAMESPACE包:
# Generated by roxygen2 (4.0.1): do not edit by hand 
useDynLib(myPackage)                                   
exportPattern("^[[:alpha:]]+")                       
importFrom(Rcpp, evalCpp) 
这是RcppExports.cpp的相关块:
// multiGenerateCSVrow
SEXP multiGenerateCSVrow(SEXP scoreMatrix, SEXP validMatrix, SEXP cutoffVector, SEXP factorVector, SEXP actualVector, SEXP scaleSample);
RcppExport SEXP myPackage_multiGenerateCSVrow(SEXP scoreMatrixSEXP, SEXP validMatrixSEXP, SEXP cutoffVectorSEXP, SEXP factorVectorSEXP, SEXP actualVectorSEXP, SEXP scaleSampleSEXP) {
BEGIN_RCPP
    SEXP __sexp_result;
    {
        Rcpp::RNGScope __rngScope;
        Rcpp::traits::input_parameter< SEXP >::type scoreMatrix(scoreMatrixSEXP );
        Rcpp::traits::input_parameter< SEXP >::type validMatrix(validMatrixSEXP );
        Rcpp::traits::input_parameter< SEXP >::type cutoffVector(cutoffVectorSEXP );
        Rcpp::traits::input_parameter< SEXP >::type factorVector(factorVectorSEXP );
        Rcpp::traits::input_parameter< SEXP >::type actualVector(actualVectorSEXP );
        Rcpp::traits::input_parameter< SEXP >::type scaleSample(scaleSampleSEXP );
        SEXP __result = multiGenerateCSVrow(scoreMatrix, validMatrix, cutoffVector, factorVector, actualVector, scaleSample);
        PROTECT(__sexp_result = Rcpp::wrap(__result));
    }
    UNPROTECT(1);
    return __sexp_result;
END_RCPP
}
和RcppExports.R:
multiGenerateCSVrow <- function(scoreMatrix, validMatrix, cutoffVector, factorVector, actualVector, scaleSample) {
    .Call('myPackage_multiGenerateCSVrow', PACKAGE = 'myPackage', scoreMatrix, validMatrix, cutoffVector, factorVector, actualVector, scaleSample)
}   
它可以寻找什么?
小智 12
我有一个类似的问题,我通过添加.noexport = c(<Functions that were implemented in C++>)到解决它foreach.
我猜这些函数从全局环境导入到并行上下文中,但是,由于它们不是普通的函数,它们实际上并不起作用.这意味着必须在每个节点上单独加载函数; 在我的情况下,这是一个SNOW clusterCall()调用,来源于各种文件,包括C++代码.
我还有一个问题,即使用Rcpp的函数在foreach中不起作用.正如Patrick McCarthy所建议的那样,我将函数放在一个软件包中,安装并加载了软件包,然后用.packages =("...")在forearch中传递它.
我仍然有一些错误,但在更新所有涉及的软件包后,这个问题得到解决.
(我会评论,但我没有足够的声誉,我认为这可能对某些人有帮助)
受到@henine & @jmb 答案的启发,我尝试了“反向”选项,即我实际上使用 foreach 循环中的 Rccp 函数获取 R 文件,并确保在 foreach 的 .packages 选项中包含“Rccp” . 可能不是最有效的,但可以完成工作并且很简单。
就像是:
cl = makeCluster(n_cores, outfile="")
registerDoParallel(cl)
foreach(n = 1:N,.packages = "Rcpp",.noexport = "<name of Rccp function>")%dopar%{
  source("Scripts/Rccp_functions.R")
  ### do stuff with functions scripted in Rccp_functions.R
}
stopImplicitCluster()
与@jmb 类似,我会发表评论,但没有足够的声誉:D
| 归档时间: | 
 | 
| 查看次数: | 5910 次 | 
| 最近记录: |