<div dir="ltr">Soren,<div><br></div><div>Thanks for the insight. For other readers possibly struggling with call by reference, the following code works as expected, i.e., x is changed to c(1, 2).</div><div><br></div><div><div>#include <Rcpp.h></div><div>using namespace Rcpp;</div><div><br></div><div>// [[Rcpp::export]]</div><div>void absC(NumericVector & x) {</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>int n = x.size();</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>for (int i = 0; i < n; ++i) {</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>if (x[i] < 0) x[i] = -x[i];</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>}</div><div>}</div><div><br></div><div>/*** R</div><div>x = c(-1, -2)</div><div>absC(x)</div><div>x</div><div>*/</div></div><div><br></div><div><div><br></div></div><div class="gmail_extra"><div class="gmail_quote">On Wed, Jul 29, 2015 at 5:36 AM, Søren Højsgaard <span dir="ltr"><<a href="mailto:sorenh@math.aau.dk" target="_blank">sorenh@math.aau.dk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Just a follow up on "copying": If you copying": If you do<br>
<br>
#include <Rcpp.h><br>
using namespace Rcpp;<br>
<br>
// [[Rcpp::export]]<br>
void absC(NumericVector & x) {<br>
if (x[0] < 0)<br>
  x = -x;<br>
}<br>
<br>
/*** R<br>
y <- -1L<br>
absC(y)<br>
y<br>
*/<br>
<br>
you'll get<br>
<br>
> y <- -1L<br>
> absC(y)<br>
> y<br>
[1] -1<br>
<br>
and that is because an IntegerVector is provided but a NumericVector is expected; hence a copying takes place.<br>
<br>
Regards<br>
Søren<br>
<br>
<br>
<br>
<br>
|-----Original Message-----<br>
|From: <a href="mailto:rcpp-devel-bounces@lists.r-forge.r-project.org">rcpp-devel-bounces@lists.r-forge.r-project.org</a> [mailto:<a href="mailto:rcpp-devel-">rcpp-devel-</a><br>
|<a href="mailto:bounces@lists.r-forge.r-project.org">bounces@lists.r-forge.r-project.org</a>] On Behalf Of Dirk Eddelbuettel<br>
|Sent: 28. juli 2015 20:46<br>
|To: Rguy<br>
|Cc: <a href="mailto:rcpp-devel@lists.r-forge.r-project.org">rcpp-devel@lists.r-forge.r-project.org</a><br>
|Subject: Re: [Rcpp-devel] Call by reference<br>
|<br>
|<br>
|On 28 July 2015 at 17:53, Rguy wrote:<br>
|| I attempted to implement the call by reference example on page 200 of<br>
|| Seamless R and C++, as follows:<br>
||<br>
|| #include <Rcpp.h><br>
|| using namespace Rcpp;<br>
||<br>
|| // [[Rcpp::export]]<br>
|| void absC(double & x) {<br>
|| if (x < 0) x = -x;<br>
|| }<br>
||<br>
|| /*** R<br>
|| x = -1<br>
|| absC(x)<br>
|| x<br>
|| */<br>
||<br>
|| Unfortunately, x remains equal to -1.<br>
|| Platforms: Windows 7,  "R version 3.1.3 Patched (2015-03-16 r68103)".<br>
|| Please advise.<br>
|<br>
|An (atomic) double does not exist in R, so you are _always_ forcing a<br>
|copy, which works against your intent here.<br>
|<br>
|Try replacing double with Rcpp::NumericVector.<br>
|<br>
|Dirk<br>
|<br>
|<br>
|--<br>
|<a href="http://dirk.eddelbuettel.com" rel="noreferrer" target="_blank">http://dirk.eddelbuettel.com</a> | @eddelbuettel | <a href="mailto:edd@debian.org">edd@debian.org</a><br>
|_______________________________________________<br>
|Rcpp-devel mailing list<br>
|<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">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" rel="noreferrer" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
</blockquote></div><br></div></div>