[Rcpp-devel] calling a homegrown cpp function from my own package when using sourceCpp

Dirk Eddelbuettel edd at debian.org
Mon Dec 30 15:38:20 CET 2013


Søren,

On 30 December 2013 at 14:27, Søren Højsgaard wrote:
| Thanks for your answers, Romain and Dirk!
| 
| I am reluctant to follow Romains suggestion because the package has a lot of c-code in it, so using load_all() takes quite some time because all c and c++ code is being compiled. (Maybe that is just slow on windows? I tried on linux (ubuntu) too but I can't get devtools installed (because RCurl for some reason can't be installed)).

Yes and yes.  Windows is slower than Linux for compiling, its filesystem code
and memory management code are often blamed for that.

On Linux (and OS X may offer the same), I even top this by setting R up to
call gcc and g++ (or gcc-4.7, g++-4.7) via the caching frontend ccache:

   ## next three lines are from my ~/.R/Makevars
   VER=-4.7
   CC=ccache gcc$(VER)
   CXX=ccache g++$(VER)

That way, when a file has not changed (in either source or its headers),
compilation is near-instantaneous as the object file is pulled from the
cache. So with the caching compiler setup, I have very low costs in
rebuilding a package.  

So my workflow is still very package-centric -- just how R likes it.

I do not know how close you can get to reinventing all of that via sourceCpp.

| I am following Dirks suggestion (and I believe that I am following section 3.5 in "Rcpp Attributes"): I have:
| 
| #include <mypack.h>
| //[[Rcpp::depends(mypack)]]
| using namespace Rcpp;
| 
| //[[Rcpp::export]]
| NumericVector aperm2_cpp(NumericVector AA, IntegerVector adim, IntegerVector perm){
|   NumericVector out( AA.length() );
|   IntegerVector pp = permuteCellEntries_cpp(perm, adim);
|   return(out);
| }
| 
| /*** R
| 
| x <- HairEyeColor
| pp <- c(2,3,1)
| aperm(x, pp)
| aperm2_cpp(x, dim(x), pp)
|  */
| 
| sourceCpp("perm-array14.cpp")
| In file included from c:/programs/R/current/library/mypack/include/mypack.h:7:0,
|                  from perm-array14.cpp:1:
| c:/programs/R/current/library/mypack/include/mypack_RcppExports.h:7:27: fatal error: RcppArmadillo.h: No such file or directory

At a minimum, you seem to lack a Rcpp::depends on RcppArmadillo.

Dirk

 compilation terminated.
| make: *** [perm-array14.o] Error 1
| Warning message:
| running command 'make -f "c:/programs/R/current/etc/x64/Makeconf" -f "c:/programs/R/current/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_63425.dll" WIN=64 TCLBIN=64 OBJECTS="perm-array14.o"' had status 2 
| g++ -m64 -I"c:/programs/R/current/include" -DNDEBUG     -I"c:/programs/R/current/library/Rcpp/include" -I"c:/programs/R/current/library/mypack/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c perm-array14.cpp -o perm-array14.o 
| Error in sourceCpp("perm-array14.cpp") : 
|   Error 1 occurred building shared library.
| 
| 
| I am sorry but I am a bit lost here. I've taken the liberty to attach my package and the "new file" in case anyone has a moment to look at it.
| 
| Thanks in advance for any additional help.
| 
| All the best
| Søren
| 
| 
| 
| 
| 
| 
| 
| 
| -----Original Message-----
| From: Dirk Eddelbuettel [mailto:edd at debian.org] 
| Sent: 30. december 2013 03:13
| To: Søren Højsgaard
| Cc: rcpp-devel at r-forge.wu-wien.ac.at
| Subject: Re: [Rcpp-devel] calling a homegrown cpp function from my own package when using sourceCpp
| 
| 
| Hi Søren,
| 
| On 30 December 2013 at 01:59, Søren Højsgaard wrote:
| | I have created a function c++ function foo which I export with //[[Rcpp::export]]. I've put the file foo.cpp with the function into the src dir of the package mypack; I've run compileAttributes and I can see the function in mypack_RcppExport.h and the automatically generated interface to the function is available in R (these Rcpp-attributes really make life easier).
| | 
| | Now I want to develop another function bar in the file bar.cpp and bar 
| | depends on foo. I want to develop bar using sourceCpp("bar.cpp") but I can not figure out how to make my c++ function foo available to bar. In bar.cpp I have //[[Rcpp::depends(mypack)]] but that does not make foo available.
| | 
| | Is it possible to do what I want (I believe it is from the documentation?) or is there another "workaround"??
| 
| I think Section 3.5 in the vignette 'Rcpp Attributes' is what you want here.
| 
| Happy New Year to you too!
| 
| Dirk
| 
| --
| Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
| application/x-gzip        [Press RETURN to save to a file]
| #include <mypack.h>
| 
| //[[Rcpp::depends(mypack)]]
| 
| using namespace Rcpp;
| 
| //[[Rcpp::export]]
| NumericVector aperm2_cpp(NumericVector AA, IntegerVector adim, IntegerVector perm){
|   NumericVector out( AA.length() );
|   IntegerVector pp = permuteCellEntries_cpp(perm, adim);
|   return(out);
| }
| 
| 
| /*** R
| 
| x <- HairEyeColor
| 
| pp <- c(2,3,1)
| aperm(x, pp)
| aperm2_cpp(x, dim(x), pp)
| 
|  */
| 

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


More information about the Rcpp-devel mailing list