[Rcpp-devel] [R] Help with integrating R and c/c++

Wray, Christopher christopher.wray.10 at ucl.ac.uk
Mon Feb 7 01:51:02 CET 2011


As Dirk says, using "inline" makes it real simple to start and to prototype code.

You mention you have R functions you wish to "call" via Rcpp. Im not certain I fully understand what you require here, but it is pretty simple to pass R-side functions to C++ via Rcpp, and similarly its simple to send compiled functions back to R-side as external pointers (and reuse them elsewhere). Here is a toy example using a simple "user" function defined on the R-side (user_F).

This is evaluated in R, passed as a "function" parameter to compiled C++ function and evaluated there, and then a compiled version of the function is passed back to R as an external pointer, which you can send back to the C side and evaluate:

<R> user_F=function(v){sum((1-v)*exp(-0.5*v))}

cpp <- '
NumericVector numvec(xvec);
NumericVector RetVec;
Function userR_f(fun);
List ATR;        
typedef SEXP (*h_ptr)(SEXP);
RetVec = userR_f(numvec);
ATR["Fn_ptr"]=XPtr<h_ptr> (new h_ptr(&fme));
ATR["Fn_VAL"]=RetVec;
return ATR;
'
inc<-'
using namespace Rcpp;
SEXP fme(SEXP x){
NumericVector xx(x);
NumericVector yy=(1-xx)*exp(-0.5*xx);
double Ans=sum(yy);
return wrap(Ans);
}
'
<R> FN_CSide <- cxxfunction(signature(xvec = "numeric", fun = "function" ),cpp, , plugin = "Rcpp", includes = inc)

cppP <- '
typedef SEXP (*h_ptr)(SEXP);
XPtr<h_ptr>p(x);
NumericVector yy(y);
yy=(*p)(yy);
return yy;
'
<R> px<-cxxfunction(signature(x = "externalptr", y = "numeric" ),cppP, , plugin = "Rcpp", includes = "using namespace Rcpp; ")

<R> R_side=FN_CSide(seq(1,5),user_F)
<R> user_F(seq(1,5))
[1] -1.548486
<R> R_side
$Fn_ptr
<pointer: 0x0964c608>
$Fn_VAL
[1] -1.548486
<R> px(R_side$Fn_ptr,seq(1,5))
[1] -1.548486

I've broken it out to make the logic explicit. The above is sloppy - and makes no attempt to treat memory de/allocation/gc/protection issues (which you should consider) especially if you pass objects around, but it does try to show you how the mechanics work.

Aside from looking up the Rcpp::sugar functionality used in places above, you might also want to look at package "RcppArmadillo", if functions and calculations involve linear algebra calcs/matrix operations. Hopefully this gives you some food-for-thought to delve further into the archives/documentation to find what you need.
chris



________________________________________
From: rcpp-devel-bounces at r-forge.wu-wien.ac.at [rcpp-devel-bounces at r-forge.wu-wien.ac.at] on behalf of Dirk Eddelbuettel [edd at debian.org]
Sent: 06 February 2011 18:18
To: Dirk Eddelbuettel
Cc: Rohit Pandey; rcpp-devel
Subject: Re: [Rcpp-devel] [R] Help with integrating R and c/c++

[ Now resending to rcpp-devel as I had said below I would --Dirk ]

On 6 February 2011 at 20:58, Rohit Pandey wrote:
| Hi,
|
| I have been using R for close to two years now and have grown quite
| comfortable with the language. I am presently trying to implement an
| optimization routine in R (Newton Rhapson). I have some R functions that
| calculate the gradient and hessian (pre requisite matrices) fairly
| efficiently. Now, I have to call this function iteratively until some
| convergance criterion is reached. I think the standard method of doing this
| in most programming languages is a while loop. However, I know R can get
| pretty slow when you use loops. In order to make this efficient, I want to
| transfer this part of my code to a more efficient programming language like
| c++ or c. However, I have been trying to learn this all day without any
| luck. I found a package called Rcpp that makes this easier. However, it
| seems some functional knowledge of writing R packages is a pre requisite. I

What gave you that impression?

Here is a counter-example, using the packages inline (for cxxfunction) and Rcpp:

  R> library(inline)
  R> src <- 'std::cout << "Hello C++_From_R World" << std::endl; return(Rcpp::wrap(42));'
  R> rohit <- cxxfunction(signature(), src, plugin="Rcpp")
  R> rohit()
  Hello C++_From_R World
  [1] 42
  R>

This compiled, linked and loaded a C++ routine built from the two-statement
program submitted as character variable.

The Rcpp documentation, including its eight vignettes, is full of other
examples. Start with Rcpp-introduction and maybe the Rcpp-FAQ.

| tried to follow the standard manual for doing this, but could not find a
| simple example to get me started. I know I am supposed to make a cpp file
| and put it some where before it can be called from R, but I'm confused as to
| how this can be done.
|
| My requirement is to start with a parameter vector, update it according to
| the gradient and hessian, check if the parameter satisfies some convergance
| criterion and continue doing this until it does. Is there a way to
| efficiently do this through an R function (replicate?). The problem is that
| the number of iterations is not fixed. If there is no function in R, is
| there a way I can quickly use Rcpp or some thing to have this last part of
| my code in a C or C++ program which repeatedly calls my R functions for
| updating the parameters?

Give the example above a first try, and then read some more. The archives of
the rcpp-devel (CC'ed; post there for follow-ups after subscribing) list are
full of examples, and the CRAN page for Rcpp lists almost two dozen other
packages using Rcpp giving you plenty of examples should you want to write a
package using Rcpp. Several of these packages do optimization giving you
examples of you to pass parameters etc pp.

Hope this helps, Dirk

|
| --
| Thanks in advance,
| Rohit
| Mob: 91 9819926213
|
|       [[alternative HTML version deleted]]
|
| ______________________________________________
| R-help at r-project.org mailing list
| https://stat.ethz.ch/mailman/listinfo/r-help
| PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
| and provide commented, minimal, self-contained, reproducible code.

--
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel at lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


More information about the Rcpp-devel mailing list