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
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://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
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel