Hi Søren,
On 30 December 2013 at 14:56, Søren Højsgaard wrote:
| Hi Dirk,
|
| With:
| ---------------------------------
| #include "mypack.h"
| //[[Rcpp::depends(mypack,RcppArmadillo,RcppEigen)]]
| using namespace Rcpp;
| using namespace mypack;
|
| //[[Rcpp::export]]
| NumericVector aperm2_cpp(NumericVector AA, IntegerVector adim, IntegerVector
perm){
| NumericVector out( AA.length() );
| IntegerVector pp = permuteCellEntries_cpp(perm, adim);
| return(out);
| }
| ----------------------------------
| things seems to work, but I just didn't guess that I had to include
RcppArmadillo and RcppEigen in the depends() because I never use any stuff from
these two packages (in this code).
I do not know either, and did not suggest to put RcppEigen there:
-- you showed an error message from the compiler stating that the
RcppArmadillo headers could not be found; I guess mypack.h has other
includes
-- consequently I suggested that you declare a dependency on RcppArmadillo
headers
-- now, if somewhere else you also include RcppEigen headers then the
addition is correct. If not, well, ...
| But I can also see your point now (I think): If I move this file to my
package then it must (probably?) be modified somewhat in the beginning.
|
| I just like to build op things with sourceCpp - and check with examples in
/*** R .... */ :)
So do I --- it is a great mechanism, and the 75 or so posts in the Rcpp
Gallery alone are a good proof.
But it has just one way to accept external functions: via Rcpp::depends()
which itself needs a package to depend upon. So back to my recommendation of
organizing code in package.
| As always: Thanks for your help :)
Always a pleasure. ;-)
Dirk
| Søren
|
|
|
|
|
|
|
|
| -----Original Message-----
| From: Dirk Eddelbuettel [mailto:[email protected]]
| Sent: 30. december 2013 15:38
| To: Søren Højsgaard
| Cc: Dirk Eddelbuettel; Romain Francois ([email protected]);
[email protected]
| Subject: RE: [Rcpp-devel] calling a homegrown cpp function from my own
package when using sourceCpp
|
|
| 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:[email protected]]
| | Sent: 30. december 2013 03:13
| | To: Søren Højsgaard
| | Cc: [email protected]
| | 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 | [email protected] | 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 | [email protected] | http://dirk.eddelbuettel.com
--
Dirk Eddelbuettel | [email protected] | http://dirk.eddelbuettel.com
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel