Thanks Douglas,<br><br>However just to be sure I get it, const is in fact protecting the pointer on origin, but not its values. Is there a way to protect the values ? This is running fine :<br>const Rcpp::NumericMatrix m_source(origin);<br>
m_source(0,0) = 0;<br><br>Etienne<br><br><br><div class="gmail_quote">2011/7/14 Douglas Bates <span dir="ltr">&lt;<a href="mailto:bates@stat.wisc.edu">bates@stat.wisc.edu</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
The way to guarantee a deep copy is to use Rcpp::clone().  In general<br>
I recommend using a const qualifier on any vectors or arrays<br>
constructed directly from the function arguments.  If they need to be<br>
coerced to another storage type they will end up being a deep copy of<br>
the original but to preserve the functional programming semantics you<br>
should regard any arguments passed to C++ function from R as<br>
read-only.<br>
<br>
I would rewrite your code fragment as<br>
<br>
    const Rcpp::NumericMatrix  m_source(origin);<br>
    Rcpp::NumericMatrix m_copy = Rcpp::clone(m_source);<br>
<div><div></div><div class="h5"><br>
On Thu, Jul 14, 2011 at 11:36 AM, Etienne B. Racine &lt;<a href="mailto:etiennebr@gmail.com">etiennebr@gmail.com</a>&gt; wrote:<br>
&gt; Hi list,<br>
&gt;<br>
&gt; I&#39;m struggling with the copy of my parameters. If I understand correctly, if<br>
&gt; you ship an int matrix to the function, you&#39;ll get a deep copy. However if<br>
&gt; it&#39;s a numeric matrix, then there&#39;s no copy and you get a matrix pointing on<br>
&gt; your R matrix. That&#39;s funny when you try to debug as one might work and the<br>
&gt; other not.<br>
&gt;<br>
&gt; Here&#39;s an illustration<br>
&gt; library(Rcpp); library(inline)<br>
&gt;<br>
&gt; f1 &lt;- cxxfunction(signature(origin=&quot;numeric&quot;), body = &quot;<br>
&gt;                   Rcpp::NumericMatrix m_source(origin);<br>
&gt;                   m_source(0,0) = 0;<br>
&gt;                   cout &lt;&lt; origin &lt;&lt; endl &lt;&lt; m_source &lt;&lt; endl ; &quot;,<br>
&gt;                   include = &quot;using namespace std;&quot;,<br>
&gt;                   plugin=&quot;Rcpp&quot;)<br>
&gt;<br>
&gt; m &lt;- matrix(1:4,2,2)<br>
&gt; x &lt;- f1(m)<br>
&gt;<br>
&gt; #0x9c7fe18<br>
&gt; #0xb416a1a8  # different<br>
&gt; m<br>
&gt; #     [,1] [,2]<br>
&gt; #[1,]    1    3<br>
&gt; #[2,]    2    4<br>
&gt; m &lt;- matrix(1:4/2,2,2)<br>
&gt; x &lt;- f1(m)<br>
&gt; #0xb416a090<br>
&gt; #0xb416a090  # no different<br>
&gt; m<br>
&gt; #     [,1] [,2]<br>
&gt; #[1,]    0  1.5<br>
&gt; #[2,]    1  2.0<br>
&gt;<br>
&gt; Now, what I&#39;d like is to have a (deep) copy of that matrix, whatever the<br>
&gt; type. I&#39;ve tried<br>
&gt; Rcpp::NumericMatrix m_copy = m_source; // of course it did not work, but<br>
&gt; never know with vectorisation ;-)<br>
&gt; sdt::copy(m_source.begin(), m_source.end(), std::back_inserter(m_copy)) //<br>
&gt; nope<br>
&gt;<br>
&gt; The closer I got was with<br>
&gt; f2 &lt;- cxxfunction(signature(origin=&quot;numeric&quot;), body = &quot;<br>
&gt;                   Rcpp::NumericMatrix m_source(origin);<br>
&gt;                   Rcpp::NumericMatrix m_copy;<br>
&gt;                   Rcpp::NumericMatrix::iterator itr;<br>
&gt;                   cout &lt;&lt; m_copy &lt;&lt; endl &lt;&lt; endl;<br>
&gt;                   m_source(0,0) = 0;<br>
&gt;                   for(itr = m_source.begin(); itr != m_source.end(); ++itr)<br>
&gt;                     m_copy.push_back(*itr);<br>
&gt;                   m_copy[3] = 1; // matrix structure is lost or never<br>
&gt; existed;<br>
&gt;                   cout &lt;&lt; origin &lt;&lt; endl &lt;&lt; m_source &lt;&lt; endl &lt;&lt; m_copy ;<br>
&gt;                   return wrap(m_copy);&quot;,<br>
&gt;                   include = &quot;using namespace std;&quot;,<br>
&gt;                   plugin=&quot;Rcpp&quot;, verbose= FALSE)<br>
&gt;<br>
&gt; Main drawback is that I loose the matrix structure. I&#39;m sure there&#39;s a<br>
&gt; correct way to do this, but I couldn&#39;t find it.<br>
&gt;<br>
&gt; Etienne<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Rcpp-devel mailing list<br>
&gt; <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
&gt; <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>
&gt;<br>
&gt;<br>
</blockquote></div><br>