remove - No se puede ejecutar la función Rcpp en foreach: "El valor NULL pasado como dirección de símbolo"
rcpp gallery (2)
Permítanme decir primero que he leído Writing R Extensions, la viñeta del paquete Rcpp, y que he creado un paquete desde Rcpp.package.skeleton()
.
Desde que multiGenerateCSVrow()
mi paquete, agregué una función, multiGenerateCSVrow()
, y luego ejecuté compileAttributes()
en el directorio del paquete antes de instalar R CMD build / R CMD. Después de cargar mi paquete, puedo ejecutar mi función directamente oa través de foreach()
con el método %do%
.
Cuando intento ejecutar en paralelo, sin embargo, me sale un error:
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"
Aquí está el paquete NAMESPACE:
# Generated by roxygen2 (4.0.1): do not edit by hand
useDynLib(myPackage)
exportPattern("^[[:alpha:]]+")
importFrom(Rcpp, evalCpp)
Aquí está la parte relevante de 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
}
Y RcppExports.R:
multiGenerateCSVrow <- function(scoreMatrix, validMatrix, cutoffVector, factorVector, actualVector, scaleSample) {
.Call(''myPackage_multiGenerateCSVrow'', PACKAGE = ''myPackage'', scoreMatrix, validMatrix, cutoffVector, factorVector, actualVector, scaleSample)
}
¿Qué podría estar buscando?
También tuve el problema de que las funciones que utilizan Rcpp no funcionaban dentro de foreach . Según lo sugerido por Patrick McCarthy, puse la función en un paquete, instalé y cargué el paquete y lo pasé en búsqueda con .packages = ("...").
Todavía tengo algunos errores, pero eso se resolvió después de actualizar todos los paquetes involucrados.
(Hubiera comentado, pero no tengo suficiente reputación y pensé que esto podría ser útil para algunas personas)
Tuve un problema similar y lo resolví agregando .noexport = c(<Functions that were implemented in C++>)
al foreach
.
Supongo que estas funciones se importan del entorno global a los contextos paralelos, pero como no son funciones normales, en realidad no funcionan. Esto significa que las funciones deben cargarse por separado en cada nodo; en mi caso, fue una clusterCall()
SNOW clusterCall()
que generó varios archivos, incluido el código C ++.