[Rcpp-devel] broken package after udpate
Romain Francois
romain at r-enthusiasts.com
Sat Nov 17 01:06:20 CET 2012
Le 17/11/12 00:59, baptiste auguie a écrit :
> 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?
I don't know.
> 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.
Well. We'll only know when people tell us I guess.
> All the best,
>
> baptiste
>
>
>
>
> On 17 November 2012 12:44, Romain Francois <romain at r-enthusiasts.com
> <mailto:romain at 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 at 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 at 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 at 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 at 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 <tel:%2B33%280%29%206%2028%2091%2030%2030>
>
> 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
>
>
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
R Graph Gallery: http://gallery.r-enthusiasts.com
`- http://bit.ly/SweN1Z : SuperStorm Sandy
blog: http://romainfrancois.blog.free.fr
|- http://bit.ly/RE6sYH : OOP with Rcpp modules
`- http://bit.ly/Thw7IK : Rcpp modules more flexible
More information about the Rcpp-devel
mailing list