tutorial remove prior cannot r rcpp

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 ++.