[Rcpp-devel] Catching parse errors with RInside::parseEval()

Theodore Lytras thlytras at gmail.com
Wed Oct 10 11:30:30 CEST 2012


2012/10/10 Dirk Eddelbuettel <edd at debian.org>:
[snip]
> On 10 October 2012 at 02:30, Theodore Lytras wrote:
> | However, if the R code passed to parseEval() contains syntax errors, my
> | application crashes with an error ("Error: Parse Error: <expression>.
> | Execution halted").
[snip]
> I looked at that recently. The main reason it dies is that we are NOT in
> interactive mode -- so the parse error leads to immediate death by design.

Uh, bummer...

> So as a start you can turn a toggle on and force interactive mode.

Great! But how do I force interactive mode to my RInside instance?

> But in
> that case you end up in code branch that is underdeveloped:
>
>     switch (status){
>     case PARSE_OK:
>         // Loop is needed here as EXPSEXP might be of length > 1
>         for(i = 0; i < Rf_length(cmdexpr); i++){
>             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;
>             }
>             if (verbose_m) {
>                 Rf_PrintValue(ans);
>             }
>         }
>         mb_m.rewind();
>         break;
>
> and the following statements.  This needs work/extensions.

I browsed the code, and a few lines down I see:

case PARSE_ERROR:
   Rf_error("Parse Error: \"%s\"\n", line.c_str());
   UNPROTECT(2);
   return 1;
   break;

thus it appears that parse errors are already handled. Even better:
handled with a return code (I don't like exceptions that much). So I
guess the only problem is that we're not in interactive mode, correct?

What kind of work/extensions do you suggest this code needs? (I could
try to work a little on that, and learn a little about the insides of
R in the process).

Anyway, on a practical side, crashing the application everytime
parseEval() encounters an error would limit usage of RInside to
applications doing prespecified analyses, or running R code that is
specified at compile-time (and is thus probably free of errors).

If one's application needs to execute "arbitrary" R code, as mine
does, this is a real showstopper. If it's only a matter of turning
interactive mode on, that would be great. Otherwise, I would like to
(try to) help bring this capability to RInside or improve it.

> Alternatively, you could tru to wrap each R expression that could fail in its
> own try/catch block. I have not tried that.

Sounds a little cumbersome, but I'll try that too as an alternative...

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


More information about the Rcpp-devel mailing list