[Rcpp-devel] RNGScope, importing function, and if-else statement

Marie Auger-Methe marie.augermethe at gmail.com
Sun Apr 15 20:01:30 CEST 2012


Hi,

I want to use a random generator that is not available in the Rcpp: rvm 
from R's CircStats package and I want the number generated to be the 
same as the equivalent function in R. Importing the function within a 
Rcpp inline function works fine except if you have an if-else statement. 
The strange thing is that it works as long at the if-statement is TRUE, 
and then it doens't work anymore and some numbers are repeated but not 
in the same order.

Here is an example:

suppressMessages(library(CircStats))
suppressMessages(library(inline))


ft <- '
   Rcpp::NumericVector xc(clone(x));
   Rcpp::Function vmc(vm);
   int n = xc.size();
   NumericVector y(n);

   RNGScope Scope;

   for(int j=0; j<n; j++){
     if(xc[j] == 0){
       y[j] = as<double>(runif(1,0,2*PI));
     }else{
       y[j] = as<double>(vmc(1,0,1));
     }
   }

   return y;'

ftt <- cxxfunction(signature( x ="numeric", vm = "function"),
             body = ft, plugin = "Rcpp")

ftr <- function(x){
     n <- length(x)
     y <- numeric(n)
     for(i in 1:n){
           if(x[i] == 0){
             y[i] = runif(1,0,2*pi)
           }else{
             y[i] = rvm(1, 0, 1)
           }
     }
     return(y)
}

x <- c(0,0,0,1,1,1,0,0,0)

set.seed(9)
r1 <- ftt(x,rvm)
set.seed(9)
r2 <- ftr(x)
cbind(x,r1,r2)

Any idea what my be causing the difference between R and Rcpp? Many 
thanks in advance!

Marie



More information about the Rcpp-devel mailing list