From hin-tak.leung at cimr.cam.ac.uk  Wed Jul 12 15:59:53 2006
From: hin-tak.leung at cimr.cam.ac.uk (Hin-Tak Leung)
Date: Wed, 12 Jul 2006 14:59:53 +0100
Subject: [Rd] Converting SEXP to primitive C types
In-Reply-To: <45511595-A6F9-4230-A759-F5CE29612AEB@comcast.net>
References: <45511595-A6F9-4230-A759-F5CE29612AEB@comcast.net>
Message-ID: <44B50059.1060101@cimr.cam.ac.uk>

Michael Petrovich wrote:
> I'm new to R development, so this may be a trivial question.
> 
> In C, How do you convert a SEXP value returned by an R function to a  
> primitive C type (int, double, char, array, etc.)? I've tried using  
> the INTEGER(x), VECTOR_ELT(x,i), and similar functions found in /src/ 
> include/Rinternals.h, but doing so results in incorrect results or a  
> seg-fault.
> 
> For example, I modified /tests/Embedding/Rerror.c so that it tries to  
> print the value returned by the function defined in error.R:
> 
> val = Test_tryEval(e, &errorOccurred);
> printf("Returned: {%d}\n", VECTOR_ELT(val, 0) );

Prof Ripley had already pointed you to the "Writing R extensions" 
manual, which explains this stuff in more details, and also hinted
that most probably it is REALSXP instead of yours guesses. So I am just 
going to give a somewhat concrete example - you want to be
doing something like this instead:

val = Test_tryEval(e, &errorOccurred);

switch( TYPEOF(val) ) {
case REALSXP:
printf("Returned: {%f}\n", REAL(val)[0]);
break;
case INTSXP:
printf("Returned: {%d}\n", INTEGER(val)[0]);
break;
case STRSXP:
printf("Returned: {%s}\n", CHAR(STRING_ELT(val, 0)));
break;
default:
printf("Don't know what to do about type %d\n", TYPEOF(val));
}

> 
> Where error.R is contains:
> 
> foo <-
> function(x=3, y=6)
> {
>    z <- x * y
>    z
> }
> 
> But the output is just "0", not the correct "18". Any ideas?
> 
> Thanks for your help!
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Converting SEXP to primitive C types
Hin-Tak Leung