[Rcpp-devel] inplace modification more affect other varibles
Dirk Eddelbuettel
edd at debian.org
Wed Oct 22 03:31:27 CEST 2014
On 21 October 2014 at 20:22, Chenliang Xu wrote:
| 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.
Very well known issue -- maybe do a search for 'Rcpp::clone' ...
In a nutshell, SEXP objects are passed by a __pointer__ and changes do
therefore persist. If you want distinct copies, use Rcpp::clone().
Dirk
| 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
|
| ```
|
| _______________________________________________
| 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
--
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
More information about the Rcpp-devel
mailing list