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 <[email protected]
<mailto:[email protected]>> 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 <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

_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to