[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