I see, thanks a lot for tracking this down. In practical terms, should I change all such functions to use SEXP + explicit wrap, or will you submit a new CRAN version soon enough fixing this? Personally I don't mind waiting a bit for the CRAN fix of cda; probably noone else uses my package and I'd rather avoid making unnecessary workaround fixes. That being said, I would be surprised if no other packages broke because of this.
All the best, baptiste On 17 November 2012 12:44, Romain Francois <rom...@r-enthusiasts.com> wrote: > This is about one of C++ most annoying things. order of includes. > > To make it short, the function that is responsible for making an R object > out of the returned arma::mat is module_wrap, which calls wrap, > > Where module_wrap is currently written, it does not "see" the wrap() > overloads from RcpppArmadillo so it just uses a version that uses begin() > and end() and therefor just creates a vector. > > So, alright. I broke this. This is an easy fix, although I'm afraid one > that has to happen in Rcpp. > > A contingency measure might be to write your euler function like this: > > > > SEXP euler(const double phi, const double theta, const double psi) > { > arma::mat Rot(3,3); > const double cosphi = cos(phi), cospsi = cos(psi), costheta = > cos(theta); > const double sinphi = sin(phi), sinpsi = sin(psi), sintheta = > sin(theta); > Rot(0,0) = cospsi*cosphi - costheta*sinphi*sinpsi; > Rot(0,1) = cospsi*sinphi + costheta*cosphi*sinpsi; > Rot(0,2) = sinpsi*sintheta; > > Rot(1,0) = -sinpsi*cosphi - costheta*sinphi*cospsi; > Rot(1,1) = -sinpsi*sinphi + costheta*cosphi*cospsi; > Rot(1,2) = cospsi*sintheta; > > Rot(2,0) = sinphi*sintheta; > Rot(2,1) = -cosphi*sintheta; > Rot(2,2) = costheta; > > return wrap(Rot); > } > > because there you call the right "wrap". > > Of course, the desired behaviour of having arma::mat as returned type will > be brought back. > > Romain > > Le 17/11/12 00:08, Dirk Eddelbuettel a écrit : > > >> On 17 November 2012 at 11:31, baptiste auguie wrote: >> | Hi, >> | >> | (Hopefully this makes it to the list; I believe I've had problems >> reaching it >> | because of a recent change between @gmail and @googlemail). >> >> Looks like it. >> >> | I made a minimal package * to illustrate the problem of my recently >> broken >> | package cda (since yesterday's update of Rcpp). There's only one >> function euler >> | () in a Module named cda. It used to return a 3x3 matrix, but after >> updating to >> | Rcpp 0.10 it returns a vector. You can run the example with >> | >> | $ R -f inst/testing/test.r >> | >> | What am I doing wrong? >> | >> | Best, >> | >> | baptiste >> | >> | * >> https://dl.dropbox.com/u/**352834/cda_1.2.1.tar.gz<https://dl.dropbox.com/u/352834/cda_1.2.1.tar.gz> >> >> Good example. I added one line >> Rcpp::Rcout << "In Euler, Rot is " << std::endl << Rot << std::endl; >> and the end of 'Euler' and we see that the dimension is in fact there, but >> then gets lost on the way out: >> >> >> edd@max:/tmp/baptiste$ r -lcda -p -e'M <- cda$euler(1.1, 2.0, 3.1); >> dim(M); class(M); M' >> [1] "cda" "grid" "reshape2" "randtoolbox" >> [5] "rngWELL" "statmod" "plyr" "RcppArmadillo" >> [9] "Rcpp" "methods" "base" >> In Euler, Rot is >> -0.4378 -0.8983 0.0378 >> -0.3894 0.1515 -0.9085 >> 0.8104 -0.4125 -0.4161 >> >> [1] -0.43778268 -0.38941320 0.81037256 -0.89828547 0.15154235 >> -0.41245379 >> [7] 0.03780919 -0.90851102 -0.41614684 >> NULL >> [1] "numeric" >> [1] -0.43778268 -0.38941320 0.81037256 -0.89828547 0.15154235 >> -0.41245379 >> [7] 0.03780919 -0.90851102 -0.41614684 >> edd@max:/tmp/baptiste$ >> >> That is with the newest Rcpp and RcppArmadillo. So somewhere we are >> loosing >> the matrix attribute. >> >> If I 'make the whole thing slower' by explicitly converting, it works -- I >> just add euler2 as >> >> NumericMatrix euler2(const double phi, const double theta, const double >> psi) { >> arma::mat M(3,3); >> M = euler(phi, theta, psi); >> return Rcpp::wrap(M); >> } >> // [...] >> function( "euler2", &euler2, "Constructs a 3x3 Euler rotation matrix" ) ;\ >> >> as seen here: >> >> >> edd@max:/tmp/baptiste$ r -lcda -p -e'M <- cda$euler2(1.1, 2.0, 3.1); >> dim(M); class(M); M' >> [1] "cda" "grid" "reshape2" "randtoolbox" >> [5] "rngWELL" "statmod" "plyr" "RcppArmadillo" >> [9] "Rcpp" "methods" "base" >> In Euler, Rot is >> -0.4378 -0.8983 0.0378 >> -0.3894 0.1515 -0.9085 >> 0.8104 -0.4125 -0.4161 >> >> [,1] [,2] [,3] >> [1,] -0.4377827 -0.8982855 0.03780919 >> [2,] -0.3894132 0.1515423 -0.90851102 >> [3,] 0.8103726 -0.4124538 -0.41614684 >> [1] 3 3 >> [1] "matrix" >> [,1] [,2] [,3] >> [1,] -0.4377827 -0.8982855 0.03780919 >> [2,] -0.3894132 0.1515423 -0.90851102 >> [3,] 0.8103726 -0.4124538 -0.41614684 >> edd@max:/tmp/baptiste$ >> >> So somewhere between the compiler getting smarter, Conrad optimising >> expression and us, an attribute got lost. >> >> Maybe Romain can find a way to make this explicit. >> >> Cheers, Dirk >> >> >> >> > > -- > Romain Francois > Professional R Enthusiast > +33(0) 6 28 91 30 30 > > R Graph Gallery: > http://gallery.r-enthusiasts.**com<http://gallery.r-enthusiasts.com> > `- http://bit.ly/SweN1Z : SuperStorm Sandy > > blog: > http://romainfrancois.blog.**free.fr<http://romainfrancois.blog.free.fr> > |- http://bit.ly/RE6sYH : OOP with Rcpp modules > `- http://bit.ly/Thw7IK : Rcpp modules more flexible > >
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel