Skip to content
Back to formatted view

Raw Message

Message-ID: <7E8037094A0C2146AA3E6F94DAE621C3B530E177@AD-EXCHMBX2-1.aau.dk>
Date: 2015-07-29T04:36:01Z
From: Søren Højsgaard
Subject: [Rcpp-devel] Call by reference
In-Reply-To: <21943.52707.228089.398714@max.nulle.part>

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-bounces at lists.r-forge.r-project.org [mailto:rcpp-devel-
|bounces at lists.r-forge.r-project.org] On Behalf Of Dirk Eddelbuettel
|Sent: 28. juli 2015 20:46
|To: Rguy
|Cc: rcpp-devel at 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 | edd at debian.org
|_______________________________________________
|Rcpp-devel mailing list
|Rcpp-devel at lists.r-forge.r-project.org
|https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel