Le 06/04/11 17:12, Davor Cubranic a écrit :
To make it harder for users to shoot themselves in the foot with 'List::create(Named("x") = 
wrap(X), ...', is it possible to make it simply illegal to assign an explicit "wrap" to a 
"Named"? This would force everyone to use implicit wraps, which as you said are safe.

Davor

Not sure. This would I guess require that create don't take SEXP as arguments. This would break more things than it solves.

I fought this during several hours this morning until I realized "well I just can't do anything", but at least now I'll be quicker to identify similar things.

BTW, the problem also exists with unnamed components in create:

return Rcpp::List::create(
  Rcpp::wrap(X),
  Rcpp::wrap(Y)
);

This exhibits the same problem.

Romain

On 2011-04-06, at 4:22 AM, Romain Francois wrote:

Hmmmmmmmm. I'm afraid I can't fix this.

Here is the story: both wrap(X) and wrap(X) create a new SEXP and allocate 
memory. When wrap(Y) is called, since the created object is large, R calls the 
GC to collect unprotected SEXP to free some space. So my guess is that at that 
point the SEXP that is generated by wrap(X) is collected since it is not 
protected.

I can not deal with this inside ::create, because it is too late.


A Workaround is to use this :

return Rcpp::List::create(
Rcpp::Named("X") = X,
Rcpp::Named("Y") = Y
);

i.e. use the implicit wrap. here wrap will be called much later and things are 
fine.


The issue is that when calling wrap it creates an unprotected SEXP, and Rcpp is 
not responsible for these. If the programmer passes an unprotected SEXP to 
::create, it is his responsability to protect it. So another alternative would 
be:

SEXP xx = PROTECT( wrap( X ) ) ;
SEXP yy = PROTECT( wrap( Y ) ) ;
Rcpp::List result =  Rcpp::List::create(
Rcpp::Named("X") = xx,
Rcpp::Named("Y") = yy
);
UNPROTECT(2) ;
return res ;

yes, this is ugly.

Romain

Le 06/04/11 11:42, Romain Francois a écrit :

Good news. I can reproduce it.
Bas news. This is likely a PROTECT problem with the Rcpp::List constructor.

Wearing my bugbuster costume, and getting ready for a fight.

Romain

Le 07/03/11 23:03, "Günter J. Hitsch" a écrit :

I'm new to Rcpp and RcppArmadillo---so far I like it a lot! Thanks to
the developers for their good work.

I run into a peculiar kind of problem when I try to pass a "large"
Armadillo object back to R. Here's some code to replicate the problem in
stylized form:


extern "C" SEXP testFun(SEXP L_)
{
const long L = Rcpp::as<long>(L_);
arma::mat X(L,1);
arma::mat Y(L,1);
X.fill(1);
Y.fill(2);
return Rcpp::List::create(
Rcpp::Named("X") = Rcpp::wrap(X),
Rcpp::Named("Y") = Rcpp::wrap(Y)
);
}


I compile (both using g++ and the Intel Compiler --- choice of compiler
makes no difference) and then call from R:


L = 1000000
ret = .Call("testFun", as.integer(L))
print(ret$X[1:5,])
print(ret$Y[1:5,])


Here's what I often get as output:

[1] 1 1 1 1 1
[1] 1 1 1 1 1

However, the second rows should be all 2's!

When I try to pass smaller matrices, for example by setting L=100000,
the problem goes away:

[1] 1 1 1 1 1
[1] 2 2 2 2 2


Also, the problem does not arise when I create and pass pack objects of
type Rcpp::NumericMatrix; so far I've see the problem only with
Armadillo objects. I've encountered this on two Macs running OS X
10.6.6, R 2.12.2, and I'm using the latest versions of Rcpp and
RcppArmadillo.

Help on this matter is appreciated!

Günter



_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel




--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
http://romain-francois.com
|- http://bit.ly/fhqbRC : Rcpp workshop in Chicago on April 28th
|- http://bit.ly/dFyZGB : Hydraulique au Montpellier Comedie Club
`- http://bit.ly/eVXit9 : Eponyme : 40 minutes stand up


_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel




--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
http://romain-francois.com
|- http://bit.ly/fhqbRC : Rcpp workshop in Chicago on April 28th
|- http://bit.ly/dFyZGB : Hydraulique au Montpellier Comedie Club
`- http://bit.ly/eVXit9 : Eponyme : 40 minutes stand up


_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to