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@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel