[Rcpp-devel] Errors inside RInside

Dirk Eddelbuettel edd at debian.org
Mon Sep 17 13:18:44 CEST 2012


Hi David,

On 17 September 2012 at 10:20, David Ibarra Gómez wrote:
|                 I am using RInside with MPI. I'm processing several time series
| in parallel (linear regresion and other things). I get an error from R:
| 
| "Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
|   contrasts can be applied only to factors with 2 or more levels
| Execution halted"
| 
| because of that the execution halts and due to this error the whole process
| halts (is not possible to call MPI_Finalize due to the sudden error):
| 
| "--------------------------------------------------------------------------
| mpirun has exited due to process rank 0 with PID 2243 on
| node debian exiting without calling "finalize". This may
| have caused other processes in the application to be
| terminated by signals sent by mpirun (as reported here)."
| 
| I am wondering if it's possible to get/launch an exception instead of an error.
| 
| If I get an exception instead of an error I'll be able to ignore/treat the
| failure for that particular time serie and process the other time series.

There are two things.  First, making RInside more fault-tolerant. Second, MPI.

As for RInside, I actually briefly looked at that the other day as this has
been on the list of things to do.  Right now, RInside always sets (in the
RInside::initialize() function)

    Rst.R_Interactive = (Rboolean) FALSE;       // sets interactive() to eval to false

FALSE leads to sudden death after an error. We need to start by setting this
to TRUE, but I am unsure what other side effects we get. 

Once that it is set to true, then in RInside::parseEval() at

            ans = R_tryEval(VECTOR_ELT(cmdexpr, i), global_env_m, &errorOccurred);
            // NB: we never actually get here if interactice is set to FALSE as it is above
            if (errorOccurred) {
                Rf_error("%s: Error in evaluating R code (%d)\n", programName, status);
                UNPROTECT(2);
                return 1;
            }

we may have a chance to do something more than the Rf_error() and maybe do
something other than return. I'm not sure what yet --- but maybe you want to
take a stab and experiment?

If and when R terminates more gracefully, MPI will probably be happier
too. It does need its finalize() call at the end...

So to sum up: right now, in non-interactice mode, the error will leads to
abrupt end of RInside.  We should probably start by trying something in
interactive mode.

Dirk

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com  


More information about the Rcpp-devel mailing list