Le 15/09/2015 13:53, Dirk Eddelbuettel a écrit :

On 15 September 2015 at 12:16, Serguei Sokol wrote:
| Hi,
|
| If we declare the following toy function where a numeric matrix is passed by 
reference,
| it works as expected, the matrix m is modified "in place":
|
| cppFunction('
| mat m2(mat& m) {
|     m=m*2;
|     return(m);
| }', depends="RcppArmadillo", inc="using namespace arma;")
| m=matrix(1:4, 2)+pi
| m2(m)
|            [,1]     [,2]
| [1,]  8.283185 12.28319
| [2,] 10.283185 14.28319
| m
|            [,1]     [,2]
| [1,]  8.283185 12.28319
| [2,] 10.283185 14.28319
|
| But if we pass to imat type, the call by reference is no more functionning:
| cppFunction('
| imat im2(imat& m) {
|     m=m*2;
|     return(m);
| }', depends="RcppArmadillo", inc="using namespace arma;")
| im=matrix(1:4, 2)
| im2(im)
|       [,1] [,2]
| [1,]    2    6
| [2,]    4    8
| im
|       [,1] [,2]
| [1,]    1    3
| [2,]    2    4
|
| The original matrix im remains as it was.
| You can easyly verify that the same is true for ivec type.
| Is it intended behaviour?

It is something else, which is a slight trick:  your 'm' is not an integer
matrix, so you are forcing a copy, which breaks the reference semantics.

See here using your code:

R> library(Rcpp)
R> cppFunction('imat im2(imat& m) { m=m*2; return(m); }', depends="RcppArmadillo", 
inc="using namespace arma;")
R> m <- matrix(c(1L,2L,3L,4L), 2)
R> m
      [,1] [,2]
[1,]    1    3
[2,]    2    4
R> storage.mode(m)
[1] "integer"
R> im2(m)
      [,1] [,2]
[1,]    2    6
[2,]    4    8
R> m
      [,1] [,2]
[1,]    2    6
[2,]    4    8
R>

So if we pass an integer matrix down, it gets changed as a side effect.
Not on my side, where m stays unchanged.
Even for the first way of defining m as
m=matrix(1:4, 2)
I have too
storage.mode(m)
[1] "integer"

Before the original post, I've checked that the matrix was in appropriate 
storage
with
> .Internal(inspect(m))
@7fc288508340 13 INTSXP g0c2 [MARK,NAM(2),ATT] (len=4, tl=0) 1,2,3,4
ATTRIB:
  @2538848 02 LISTSXP g0c0 [MARK]
    TAG: @6ce018 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value)
    @7fc2884be728 13 INTSXP g0c1 [MARK,NAM(2)] (len=2, tl=0) 2,2

giving well INTSXP but pass by reference was not working.

So, what have I to check in my installation to find the origin of
an unwanted copy?

Serguei.

_______________________________________________
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