[Rcpp-devel] [R] Help with integrating R and c/c++
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.