[Rcpp-devel] Trouble passing arguments to R functions that have been passed in (maybe)

Anthony Lee awllee at gmail.com
Mon Sep 10 22:23:16 CEST 2012


It seems to be the casethat when the memory issue occurs, garbage 
collection has just been called by R, at least according to gcinfo.In 
particular, it is called when bar is called and cleans up the arguments 
that bar is about to use, thus causing a problem.

Is there a way to ensure the safety of the arguments that are sent back 
to R?

On 10/09/12 17:02, Anthony Lee wrote:
> Hello,
>
> I'm quite new to Rcpp (and R in fact) and I'm having a little bit of 
> trouble understanding what is going on in some of my code. I have 
> written a fairly small example that exhibits the troublesome behaviour 
> using inline (below). The code doesn't do anything interesting, but 
> runCode() does cause a "memory not mapped" error. Other times I get an 
> "unimplemented type 'NULL' in 'coerceToInteger'" error.
>
> It seems to be the case that sometimes the values N and true do not 
> make it back safely to R when calling bar within foo and get 
> transformed into NULL or doubles, etc. I still have issues if I 
> "PROTECT" their conversion to SEXP via wrap.
>
> I know it is not particularly good to have C++ functions calling R 
> functions that have been passed in, but this is a very useful feature 
> for me and I have been very happy with Rcpp until this starting 
> happening.
>
> Any help on what mistake I've made would be greatly appreciated.
>
> Thanks,
> Anthony
>
> Code: (note that removing X and Y seems to make the code more stable)
>
> require(inline)
>
> foo <- cxxfunction(
>   signature(N_in = "numeric", n_in = "numeric", bar_in = "function"), 
> body='
>   BEGIN_RCPP
>   int N = as<int>(N_in);
>   int n = as<int>(n_in);
>   Function bar(bar_in);
>   IntegerMatrix A(N,n);
>   GenericMatrix X(N,n);
>   GenericMatrix Y(N,n);
>   A(_,0) = seq_len(N-1);
>
>   for (int i = 1; i < n; i++) {
>     A(_,i) = as<IntegerVector>(bar(A(_,i-1),N,true));
>   }
>
>   return wrap(A);
>   END_RCPP
>   ', plugin = "Rcpp" )
>
> translate <- function(size,cond,vs) {
>   if (cond) {
>     return((vs + 1) %% size)
>   } else {
>     return((vs - 1) %% size)
>   }
> }
>
> bar <- function(vs,M,cond) {
>   return(translate(size=M,cond=cond,vs=vs))
> }
>
> runCode <- function() {
>   for (i in 1:5) {
>     for (j in 1:10) {
>       print(paste(i,j,sep=" "));
>       B <- foo(i*100,j*100,bar);
>     }
>   }
> }
>
> # runCode()



More information about the Rcpp-devel mailing list