From romain.francois at dbmail.com  Thu Jan 14 11:42:42 2010
From: romain.francois at dbmail.com (Romain Francois)
Date: Thu, 14 Jan 2010 11:42:42 +0100
Subject: [Rd] how to call a function from C
Message-ID: <4B4EF522.8020703@dbmail.com>

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



[Rd] how to call a function from C
Romain Francois