The Rcpp library in RcppTemplate (the package that Rcpp forked from) simplifies the process of calling functions from C++. The design goal was to enable users to focus on scientific problem solving rather than interface problems and low-level R internals (by hiding these details and documenting everything).
The current Rcpp package is a mashup of the packages RcppTemplate (old version), inline, and RInside that involves a fair amount of low-level R hacking, and this is probably consistent with the preferences of most readers of this list. If I am mistaken and there are any users of RcppTemplate please let me know, as I am thinking about reoganizing that package to minimize confusion with the fork. Thanks, Dominick On Thu, Jan 14, 2010 at 7:16 AM, Romain Francois <romain.franc...@dbmail.com > wrote: > On 01/14/2010 12:42 PM, Laurent Gautier wrote: > >> 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). >> > > Sure. I did not want to over-complicate the question. > > I'm currently reviewing tryEval and its underlying R_TopLevelExec which > does not give me enough : when the error occurs, it'd be useful that the > function returns the condition object instead of NULL. > > > 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) >> > > nice > > > -- > 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@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel