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

Dirk Eddelbuettel edd at debian.org
Sat Feb 19 18:37:08 CET 2011


Rohit,

Please stop cross-posting to r-help. I have removed the list from the CCs now.

On 19 February 2011 at 22:51, Rohit Pandey wrote:
| Hi Douglas,
| 
| Sorry for leaving that information out earlier.
| 
| I am running windows XP. I'm not sure about the tools you mention. I thought
| installing the packages in R was enough. Are these tools like a program you
| install?

You need a compiler.  Start by reading Appendix D of the 'R Administration'
manual available with your R installation as well as on all mirrors.

I am adding something to the Rcpp-FAQ vignette to that effect now.

Dirk
 
| The results of running sessionInfo() are:
| 
| R version 2.12.1 (2010-12-16)
| Platform: i386-pc-mingw32/i386 (32-bit)
| 
| locale:
| [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United
| States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=
| C                         
| [5] LC_TIME=English_United States.1252   
| 
| attached base packages:
| [1] stats     graphics  grDevices utils     datasets  tcltk    
| methods   base  
| 
| 
| 
| On Sat, Feb 19, 2011 at 9:21 PM, Douglas Bates <bates at stat.wisc.edu> wrote:
| 
|     On Sat, Feb 19, 2011 at 12:56 AM, Rohit Pandey <rohitpandey576 at gmail.com>
|     wrote:
|     > Hi Christopher/ Dirk,
| 
|     > Thank you very much for your replys. I think the idea of using inline as
|     you
|     > suggest is the best way to start off with using c++ with R. I went
|     through
|     > your examples and also plenty I found on the net. I have been trying to
|     run
|     > some of these over the past few days, but have consistently been getting
|     > this error message as soon as I run the 'cfunction' or 'cxxfunction'. For
|     > example, in the syntax that Dirk sent,
|     > R> library(inline) #Runs perfectly
|     >  R> src <- 'std::cout << "Hello C++_From_R World" << std::endl;
|     > return(Rcpp::wrap(42));' #Runs perfectly
|     >  R> rohit <- cxxfunction(signature(), src, plugin="Rcpp")
|     > Now, as soon as I run this line, R spills a whole lot of text out and
|     gives
|     > an error and a warning:
|     > ERROR(s) during compilation: source code errors or compiler configuration
|     > errors!
|     > Program source:
|     >  1:
|     >  2: // includes from the plugin
|     >  3:
|     >  4: #include <Rcpp.h>
|     >  5:
|     >  6:
|     >  7: #ifndef BEGIN_RCPP
|     >  8: #define BEGIN_RCPP
|     >  9: #endif
|     >  10:
|     >  11: #ifndef END_RCPP
|     >  12: #define END_RCPP
|     >  13: #endif
|     >  14:
|     >  15: using namespace Rcpp;
|     >  16:
|     >  17:
|     >  18: // user includes
|     >  19:
|     >  20:
|     >  21: // declarations
|     >  22: extern "C" {
|     >  23: SEXP file59046688( ) ;
|     >  24: }
|     >  25:
|     >  26: // definition
|     >  27:
|     >  28: SEXP file59046688(  ){
|     >  29: BEGIN_RCPP
|     >  30: std::cout << "Hello C++_From_R World" << std::endl;
|     > return(Rcpp::wrap(42));
|     >  31: END_RCPP
|     >  32: }
|     >  33:
|     >  34:
|     > Error in compileCode(f, code, language = language, verbose = verbose) :
|     >  Compilation ERROR, function(s)/method(s) not created!
|     > In addition: Warning message:
|     > running command 'C:\PROGRA~1\R\R-212~1.1/bin/i386/R CMD SHLIB
|     > file59046688.cpp 2> file59046688.cpp.err.txt' had status 1
|     >
|     > The "file59046688.cpp 2"  changes every time I run a different function,
|     but
|     > the problem seems to be the same.
|     >
|     > I installed and loaded the inline package (0.3.8) and then the Rcpp
|     package
|     > (0.9.0). I also tried reversing the order in which I load these, but
|     still
|     > no luck. I think if I can get just one of these programs to work, I will
|     be
|     > on my way. Can any of you tell me what I might be doing wrong?
|     >
|     > For your question on what exacly I require, Christopher - I just need to
|     use
|     > a while loop. I have always been able to substitute for loops with some
|     of
|     > the apply functions in R, but can't seem to be able to replace the while
|     > with a more efficient function. But the things that are required inside
|     the
|     > while loop, I have already implemented in R efficiently. So, I thought of
|     > transfering just the while loop to a language that is faster with loops.
| 
|     What operating system and version of R are you using?  It would help
|     if you included the results of executing
| 
|     sessionInfo()
| 
|     in R.  More importantly, do you have the compiler tools installed and
|     configured?  You need to have certain tools installed on Windows or
|     Mac OS X before you can compile packages (as opposed to installing
|     pre-compiled binary packages).  Most Linux distributions assume that
|     their users are adults and provide them with the tools to compile
|     programs.
| 
|     >
|     > Thanks in advance.
|     > On Mon, Feb 7, 2011 at 6:21 AM, Wray, Christopher <
|     > christopher.wray.10 at ucl.ac.uk> wrote:
|     >
|     >> 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<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
|     >
|     >
|     >
|     >
|     > --
|     > Thanks,
|     > 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.
|     >
| 
| 
| 
| 
| --
| Thanks,
| Rohit
| Mob: 91 9819926213
| 

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list