[Rd] Parsing code with newlines

Jeffrey Horner jeff.horner at vanderbilt.edu
Mon Aug 4 16:51:42 CEST 2008


Duncan Murdoch wrote on 08/04/2008 08:11 AM:
> On 04/08/2008 8:50 AM, Peter Jaeger wrote:
>> Dear List,
>>
>> When I try to parse code containing newline characters with 
>> R_ParseVector, I
>> get a compilation error. How can I compile code that includes comments 
>> and
>> newlines?
>>
>> I am using the following:
>>
>> void* my_compile(char *code)
>> {
>>     SEXP cmdSexp, cmdExpr = R_NilValue;
>>     ParseStatus status;
>>
>>     PROTECT (cmdSexp = allocVector (STRSXP, 1));
>>     SET_STRING_ELT (cmdSexp, 0, mkChar (code));
>>     PROTECT (cmdExpr = R_ParseVector (cmdSexp,-1,&status,
>>         R_NilValue));
>>     UNPROTECT_PTR (cmdSexp);
>>
>>     if (status != PARSE_OK) {
>>         return (void*)0;
>>     } else {
>>         return (void*)cmdExpr;
>>     }
>> }
> 
> You need to put together a reproducible example if you want help. 
> parse() uses R_ParseVector, and it handles newlines fine.

As a follow up, it'd be good to know the exact value of your status 
variable. You've only tested for PARSE_OK, but there's also 
PARSE_INCOMPLETE, PARSE_NULL, PARSE_ERROR, and PARSE_EOF.

Here's a function that I use in rapache that not only parses but 
executes the code as well. While it doesn't really help you with your 
parsing problem, I suspect that you'll want to do something with the 
returned expressions after you've parsed the code, and the point is that 
R_ParseVector() can return more than one expression. Thus you'll need to 
loop through each expression and eval() it separately. The function 
returns 1 when the code was parsed and executed, and 0 on failure.

(it's been awhile since I've had to touch this, and although I do keep 
up with R development, my skills at remembering which macros and 
functions to use are lacking. Anyone spot something I shouldn't be 
doing? like mkChar() or some such? )

static int ExecRCode(const char *code, SEXP env, int *error){
	ParseStatus status;
	SEXP cmd, expr, fun;
	int i, errorOccurred=1, retval = 1;

	PROTECT(cmd = allocVector(STRSXP, 1));
	SET_STRING_ELT(cmd, 0, mkChar(code));

	/* fprintf(stderr,"ExecRCode(%s)\n",code); */
	PROTECT(expr = R_ParseVector(cmd, -1, &status,R_NilValue));

	switch (status){
		case PARSE_OK:
			for(i = 0; i < length(expr); i++){
				R_tryEval(VECTOR_ELT(expr, i),env,&errorOccurred);
				if (error) *error = errorOccurred;
				if (errorOccurred){
					retval=0;
					break;
				}
			}
		break;
		case PARSE_INCOMPLETE:
		case PARSE_NULL:
		case PARSE_ERROR:
		case PARSE_EOF:
		default:
			retval=0;
		break;
	}
	UNPROTECT(2);

	return retval;
}



> 
> Duncan Murdoch
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel


-- 
http://biostat.mc.vanderbilt.edu/JeffreyHorner



More information about the R-devel mailing list