<div dir="ltr">I should check the syntax before sending the message.<br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 31, 2013 at 11:30 AM, Douglas Bates <span dir="ltr"><<a href="mailto:bates@stat.wisc.edu" target="_blank">bates@stat.wisc.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">The as function in RcppEigen can form an<div><br></div><div>Eigen::Map<Eigen::MatrixXd></div><div>
<br></div><div>but doesn't know how to form an</div><div class="im"><div><br></div><div>Eigen::Map<const Eigen::MatrixXd></div>
<div><br></div></div><div>Generally I find that I confuse myself less when the const is outside the Eigen::Map.  In other words, I use something like</div><div><br></div><div>typedef Eigen::Map<Eigen::MatrixXd> mMat;</div>

<div><br></div><div>const mMat M(mat_from_R);</div></div></blockquote><div><br></div><div style>That should be</div><div style><br></div><div style>const mMat M = as<mMat>(mat_from_R);</div><div style><br></div><div style>
Well, at least I think so. </div><div style><br></div><div style>The bottom line is that I find it easier to use const in the declaration of an instance of a class, not in the typedef.</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div><br></div><div>This tells me that M is a mapped MatrixXd object which is constructed from the SEXP mat_from_R and is read-only.<br><div><br></div></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra">

<br><br><div class="gmail_quote">On Thu, Jan 31, 2013 at 11:01 AM, M A <span dir="ltr"><<a href="mailto:markoilcan@gmail.com" target="_blank">markoilcan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

I am compiling some source code using sourceCpp and getting a<br>
compiling failure when the source has the line with the const keyword<br>
but no failure when it does not, in the below source.<br>
<br>
// file: minimaltest.cpp<br>
// [[Rcpp::depends(RcppEigen)]]<br>
<br>
#include <RcppEigen.h><br>
#include <Rcpp.h><br>
<br>
typedef Eigen::Map<Eigen::VectorXd> MapVecd;<br>
//typedef Eigen::Map<Eigen::MatrixXd> MapMatd; // This one works<br>
typedef Eigen::Map<const Eigen::MatrixXd> MapMatd; // This one fails<br>
<br>
// [[Rcpp::export]]<br>
Eigen::VectorXd testfunc(const MapVecd ytrait, MapMatd xmat) {<br>
<br>
    return ytrait;<br>
}<br>
<br>
This is the error:<br>
<br>
> sourceCpp("minimaltest.cpp")<br>
g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include<br>
-I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG<br>
-I/usr/local/include<br>
-I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include"<br>
-I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include"<br>
  -fPIC  -g -O2  -c minimaltest.cpp -o minimaltest.o<br>
Error in sourceCpp("minimaltest.cpp") :<br>
  Error 1 occurred building shared library.<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/internal/Exporter.h:<br>
In constructor ‘Rcpp::traits::Exporter<T>::Exporter(SEXPREC*) [with T<br>
= Eigen::Map<const Eigen::Matrix<double, -0x00000000000000001,<br>
-0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,<br>
0, Eigen::Stride<0, 0> >]’:<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/as.h:67:<br>
  instantiated from ‘T Rcpp::internal::as(SEXPREC*,<br>
Rcpp::traits::r_type_generic_tag) [with T = Eigen::Map<const<br>
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
-0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0><br>
>]’<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/as.h:112:<br>
  instantiated from ‘T Rcpp::as(SEXPREC*) [with T = Eigen::Map<const<br>
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
-0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0><br>
>]’<br>
minimaltest.cpp:35:   instantiated from here<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/internal/Exporter.h:31:<br>
error: no matching function for call to ‘Eigen::Map<const<br>
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
-0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0><br>
>::Map(SEXPREC*&)’<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:164:<br>
note: candidates are: Eigen::Map<MatrixType, MapOptions,<br>
StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,<br>
MapOptions, StrideType>,<br>
(Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,<br>
MapOptions, StrideType> >::has_write_access ?  WriteAccessors :<br>
ReadOnlyAccessors)>::PointerType, typename<br>
Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,<br>
StrideType> >::Index, typename<br>
Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,<br>
StrideType> >::Index, const StrideType&) [with PlainObjectType = const<br>
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
-0x00000000000000001, -0x00000000000000001>, int MapOptions = 0,<br>
StrideType = Eigen::Stride<0, 0>]<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:151:<br>
note:                 Eigen::Map<MatrixType, MapOptions,<br>
StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,<br>
MapOptions, StrideType>,<br>
(Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,<br>
MapOptions, StrideType> >::has_write_access ?  WriteAccessors :<br>
ReadOnlyAccessors)>::PointerType, typename<br>
Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,<br>
StrideType> >::Index, const StrideType&) [with PlainObjectType = const<br>
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,<br>
-0x00000000000000001, -0x00000000000000001>, int MapOptions = 0,<br>
StrideType = Eigen::Stride<0, 0>]<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:139:<br>
note:                 Eigen::Map<MatrixType, MapOptions,<br>
StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,<br>
MapOptions, StrideType>,<br>
(Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,<br>
MapOptions, StrideType> >::has_write_access ?  WriteAccessors :<br>
ReadOnlyAccessors)>::PointerType, const StrideType&) [with<br>
PlainObjectType = const Eigen::Matrix<double, -0x00000000000000001,<br>
-0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,<br>
int MapOptions = 0, StrideType = Eigen::Stride<0, 0>]<br>
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:106:<br>
note:                 Eigen::Map<const Eigen::Matrix<double,<br>
-0x00000000000000001, -0x00000000000000001, 0, -0x00000000000000001,<br>
-0x00000000000000001>, 0, Eigen::Stride<0, 0> >::Map(const<br>
Eigen::Map<const Eigen::Matrix<double, -0x00000000000000001,<br>
-0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,<br>
0, Eigen::Stride<0, 0> >&)<br>
make: *** [minimaltest.o] Error 1<br>
<br>
Here is my session info:<br>
> sessionInfo()<br>
R version 2.15.2 (2012-10-26)<br>
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)<br>
<br>
locale:<br>
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8<br>
<br>
attached base packages:<br>
[1] stats     graphics  grDevices utils     datasets  methods   base<br>
<br>
other attached packages:<br>
[1] RcppEigen_0.3.1.2 Matrix_1.0-9      lattice_0.20-10   Rcpp_0.10.2<br>
<br>
loaded via a namespace (and not attached):<br>
[1] grid_2.15.2  tools_2.15.2<br>
<br>
Note that the g++... portion works fine on the command line, so I<br>
guess the failure is somewhere in the building of the library. Of<br>
course I can get around this by not using the const keyword, but why<br>
is there a problem and what is the right fix?<br>
<br>
Thanks,<br>
Mark A<br>
_______________________________________________<br>
Rcpp-devel mailing list<br>
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" target="_blank">Rcpp-devel@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>