[Rcpp-devel] inplace modification more affect other varibles

Chenliang Xu luckyrand at gmail.com
Wed Oct 22 03:22:23 CEST 2014


Hello,

With the following inplace sorting example, I understand the value of `a`
is sorted inplace, but it's strange to see the value of `b` is also
modified. This can cause some hard to detect bug, since the cpp function
may modify a variable defined in other scope.

It seems that rcpp doesn't respect the named field, which is adopted by R
to implement copy-on-modify. I don's see an easy fix on C++ side, since the
called cpp function has no information about variable binding in R. A
possible fix is adding a function `inplace` to R, which ensure the returned
variable has named filed = 0 so is safe to modify inplace. Then, we have to
call the function as `stl_sort_inplace(inplace(a))`, which seems odd but is
also informative. It shows clearly that we are breaking the pass-by-value
rule in R.

```cpp
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void stl_sort_inplace(NumericVector x) {
    std::sort(x.begin(), x.end());
}

```

```r
a <- seq(1, 0.1, -0.1)
b <- a
#  [1] 1.0 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1

stl_sort_inplace(a)

a
#  [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

b
#  [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

a <- seq(1, 0.1, -0.1)
pure_function <- function (x) {
  y <- x
  stl_sort_inplace(y)
  print(y)
}
pure_function(a)
a
#  [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

```
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20141021/7c0f16cc/attachment-0001.html>


More information about the Rcpp-devel mailing list