r - 无法在 foreach 中运行 Rcpp 函数 - "NULL value passed as symbol address"

标签 r rcpp

首先让我说我读过Writing R Extensions,Rcpp 包小插图,并且我已经从Rcpp.package.skeleton() 构建了一个包。 .

自从构建我的包后,我添加了一个函数,multiGenerateCSVrow() ,然后跑 compileAttributes()在 R CMD 构建/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)
}   

它可能在寻找什么?

最佳答案

我有一个类似的问题,我通过添加 .noexport = c(<Functions that were implemented in C++>) 解决了它到 foreach .

我猜这些函数是从全局环境导入到并行上下文中的,但是,由于它们不是普通函数,因此它们实际上不起作用。这确实意味着必须在每个节点上单独加载功能;就我而言,那是一场雪 clusterCall()调用源各种文件,包括 C++ 代码。

关于r - 无法在 foreach 中运行 Rcpp 函数 - "NULL value passed as symbol address",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25062383/

相关文章:

c++ - 使用 rcpp/rinside 包时如何将 dll 库包含在 makefile 中

R 使用第二个 tibble 中的数据作为行和列更新 tibble

rcpp 函数在 ubuntu 上工作,但在 windows 和 mac 上不起作用

c++ - 使用包含索引的 IntegerVector 子集 Rcpp::DateVector?运算符 [] 重载

r - 在 R 中使用矩阵替换函数时出现问题

Solaris 上的 Rcpp

c++ - 直接在 Rcpp 中使用 (c)igraph(即不通过 R)

r - 使用 Shiny 和 ggplot2 在单个图形上绘制多条线

返回数据帧列表中两个字符串之间的值 [R]

r - 在 R 中选择随机数据点