[Rd] how to call a function from C
Romain Francois
romain.francois at dbmail.com
Thu Jan 14 11:42:42 CET 2010
Hi,
In Rcpp, we now have a "Function" class to encapsulate functions (they
cover all three kinds, but this may change).
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.
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 ) ;
--
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
More information about the R-devel
mailing list