Just a follow up on "copying": If you copying": If you do

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void absC(NumericVector & x) {
if (x[0] < 0) 
  x = -x;
}

/*** R
y <- -1L
absC(y)
y
*/

you'll get 

> y <- -1L
> absC(y)
> y
[1] -1

and that is because an IntegerVector is provided but a NumericVector is 
expected; hence a copying takes place. 

Regards
Søren




|-----Original Message-----
|From: rcpp-devel-boun...@lists.r-forge.r-project.org [mailto:rcpp-devel-
|boun...@lists.r-forge.r-project.org] On Behalf Of Dirk Eddelbuettel
|Sent: 28. juli 2015 20:46
|To: Rguy
|Cc: rcpp-devel@lists.r-forge.r-project.org
|Subject: Re: [Rcpp-devel] Call by reference
|
|
|On 28 July 2015 at 17:53, Rguy wrote:
|| I attempted to implement the call by reference example on page 200 of
|| Seamless R and C++, as follows:
||
|| #include <Rcpp.h>
|| using namespace Rcpp;
||
|| // [[Rcpp::export]]
|| void absC(double & x) {
|| if (x < 0) x = -x;
|| }
||
|| /*** R
|| x = -1
|| absC(x)
|| x
|| */
||
|| Unfortunately, x remains equal to -1.
|| Platforms: Windows 7,  "R version 3.1.3 Patched (2015-03-16 r68103)".
|| Please advise.
|
|An (atomic) double does not exist in R, so you are _always_ forcing a
|copy, which works against your intent here.
|
|Try replacing double with Rcpp::NumericVector.
|
|Dirk
|
|
|--
|http://dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org
|_______________________________________________
|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
_______________________________________________
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

Reply via email to