Re: [Rd] how to call a function from C

From: Laurent Gautier <lgautier_at_gmail.com>
Date: Thu, 14 Jan 2010 12:42:23 +0100

> Hi,
>
> In Rcpp, we now have a "Function" class to encapsulate functions
> (they cover all three kinds, but this may change).

Just a note on that: there is probably no hurry to do so. rpy2 is also having CLOSXP, BUILTINSXP, and SPECIALSXP represented as one function-like class and seems to be behave reasonably while a lot of other things seem more urgent to sort out.

> To call the function, what we do is generate a call with the function
> as the first node and then evaluate the call.
>
> SEXP stats = PROTECT( R_FindNamespace( mkString( "stats") ) ); SEXP
> rnorm = PROTECT( findVarInFrame( stats, install( "rnorm") ) ) ; SEXP
> call = PROTECT( LCONS( rnorm, CONS( ScalarInteger(10),
> CONS(ScalarReal(0), R_NilValue ) ) ) ); SEXP res = PROTECT( eval(
> call , R_GlobalEnv ) ); UNPROTECT(4) ; return res ;
>
> It works, but I was wondering if there was another way. I've seen
> applyClosure, but I'm not sure I should attempt to use it or if using
> a call like above is good enough.

Using R_tryEval() will let you evaluate an expression in a given environment, as well as capture an eventual error occurring during its evaluation (and translate it as an exception).

> Romain
>
> PS: using Rcpp's C++ classes you would express the code above as :
>
> Environment stats("package:stats") ; Function rnorm = stats.get(
> "rnorm" ) return rnorm( 10, 0.0 ) ;

Feel free to snoop in rpy2's rpy/rinterface/rinterface.c and look for "do_try_eval". The behavior looks very similar, the above snippet in rpy2 would write like:

from rpy2.robjects.packages import importr stats = importr('stats')
stats.rnorm(10, 0.0)

> -- Romain Francois Professional R Enthusiast +33(0) 6 28 91 30 30
> http://romainfrancois.blog.free.fr |- http://tr.im/KfKn : Rcpp 0.7.2
> |- http://tr.im/JOlc : External pointers with Rcpp `-
> http://tr.im/JFqa : R Journal, Volume 1/2, December 2009



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu 14 Jan 2010 - 11:45:29 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 14 Jan 2010 - 13:40:13 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive