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) );
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!
Converting SEXP to primitive C types
3 messages · Michael Petrovich, Brian Ripley, Hin-Tak Leung
On Tue, 11 Jul 2006, 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.
See `Writing R Extensions', the documentation for that file. You cannot just guess that an object has the appropriate SEXPTYPE: you have to check it (or coerce to it). In your example it is likely to be a REALSXP (it could be an INTSXP), so you need to cover all possible cases.
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) );
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!
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
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