[Rcpp-devel] About calling C/C++ functions in R
Romain Francois
romain at r-enthusiasts.com
Wed Jun 16 13:44:18 CEST 2010
Le 16/06/10 13:27, xiagao1982 a écrit :
> Thanks for your help! When will the new version 0.8.3 be released?
This is not planned yet. So you still have lots of time to read the
documentation.
Romain
> ------------------------------------------------------------------------
> xiagao1982
> 2010-06-16
> ------------------------------------------------------------------------
> *发件人:* Romain Francois
> *发送时间:* 2010-06-16 17:15:35
> *收件人:* xiagao1982
> *抄送:* rcpp-devel
> *主题:* Re: [Rcpp-devel] About calling C/C++ functions in R
> Le 16/06/10 10:56, Romain Francois a écrit :
> >
> > Hi,
> >
> > I totally second Dirk in the advice about reading the appropriate
> > documents. I would add the book from John Chambers "Programming with
> > Data" as it has very clear chapters about R and C(++).
> >
> > Once you digested these documents, you can read the Rcpp-modules
> > vignette from Rcpp, which might help you.
> >
> > Also, I just commited some code in Rcpp (which will be available in the
> > next version of Rcpp : 0.8.3) that adds the Rcpp::InternalFunction
> > class, that you can use like this:
> >
> > // grab the global environment
> > Environment g = Environment::global_env() ;
> >
> > // assign the "hello" R variable to the internal function
> > g["hello"] = InternalFunction( &hello ) ;
> >
> >
> >
> > Here is a complete example you can run from the R prompt:
> >
> > require( Rcpp)
> > require( inline)
> >
> > inc <- '
> >
> > const char* hello( std::string who ){
> > std::string result( "hello " ) ;
> > result += who ;
> > return result.c_str() ;
> > }
> >
> > '
> > code <- '
> > Environment g = Environment::global_env() ;
> > g["hello"] = InternalFunction( &hello ) ;
> > return R_NilValue ;
> > '
> > fx <- cxxfunction( signature(), code, inc, plugin = "Rcpp" )
> > f <- fx() # force loading the dynamic library
> >
> > hello( "world" )
> >
> > I have not tried it yet from RInside.
> Done. I added this as a new example "rinside_sample9.cpp".
> // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8; -*-
> //
> // Simple example showing how expose a C++ function
> //
> // Copyright (C) 2010 Dirk Eddelbuettel and Romain Francois
> #include <RInside.h> // for the embedded R via RInside
> // a c++ function we wish to expose to R
> const char* hello( std::string who ){
> std::string result( "hello " ) ;
> result += who ;
> return result.c_str() ;
> }
> int main(int argc, char *argv[]) {
> // create an embedded R instance
> RInside R(argc, argv);
> // expose the "hello" function in the global environment
> R["hello"] = Rcpp::InternalFunction( &hello ) ;
> // call it and display the result
> std::string result = R.parseEval("hello('world')") ;
> std::cout << "hello( 'world') = " << result << std::endl ;
> exit(0);
> }
> Romain
> > Romain
> >
> > Le 16/06/10 02:13, xiagao1982 a écrit :
> >> Dear friends,
> >> I am a newcomer of Rcpp and RInside. I installed them in my system and
> >> successfully build the following example:
> >> #include <RInside.h> // for the embedded R via RInside
> >> Rcpp::NumericMatrix createMatrix(const int n) {
> >> Rcpp::NumericMatrix M(n,n);
> >> for (int i=0; i<n; i++) {
> >> for (int j=0; j<n; j++) {
> >> M(i,j) = i*10+j;
> >> }
> >> }
> >> return(M);
> >> }
> > >
> >> int main(int argc, char *argv[]) {
> >> const int mdim = 4; // let the matrices be 4 by 4
> >> SEXP ans;
> >> RInside R(argc, argv); // create an embedded R instance
> >> Rcpp::NumericMatrix M = createMatrix(mdim); // create and fill a sample
> >> data Matrix
> >> R["M"] = M; // assign C++ matrix M to R's 'M' var
> >> std::string evalstr = "\
> >> cat('Running ls()\n'); print(ls()); \
> >> cat('Showing M\n'); print(M); \
> >> cat('Showing colSums()\n'); Z <- colSums(M); print(Z); \
> >> Z"; // returns Z
> >> ans = R.parseEval(evalstr); // eval the init string -- Z is now in ans
> >> Rcpp::NumericVector v(ans); // convert SEXP ans to a vector of doubles
> >> for (int i=0; i< v.size(); i++) { // show the result
> >> std::cout << "In C++ element " << i << " is " << v[i] << std::endl;
> >> }
> >> exit(0);
> >> }
> >> Now I add a function in the C++ code:
> >> const char* hello( std::string who ){
> >> std::string result( "hello " ) ;
> >> result += who ;
> >> return result.c_str() ;
> >> }
> >> And I try to call this function in R:
> >> std::string txt = "ret = hello('Friends'); print(ret);";
> >> R.parseEvalQ(txt); // eval string quietly, no result
> >> It fails to do that.
> >> Could you please tell me how to achieve that? Thanks very much!
> >> Gao Xia
> >> ------------------------------------------------------------------------
> >> xiagao1982
> >> 2010-06-16
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/98Uf7u : Rcpp 0.8.1
|- http://bit.ly/c6YnCi : graph gallery collage
`- http://bit.ly/bZ7ltC : inline 0.3.5
More information about the Rcpp-devel
mailing list