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

Marie Auger-Methe marie.augermethe at gmail.com
Mon Apr 16 09:56:26 CEST 2012


Hi Dirk,

Thank you for the prompt reply!
By reimplement rvm using Rcpp sugar functions, do you mean re-write the 
rvm function using sugar functions?

Marie
On 15/04/2012 9:39 PM, Dirk Eddelbuettel wrote:
> Hi Marie,
>
> On 15 April 2012 at 19:01, Marie Auger-Methe wrote:
> | 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!
>
> I won't have a chance to disentangle this in detail, but could you possibly
> just "reimplement" what rvm does using the Rcpp sugar functions?
>
> That way you would be guaranteed the "nice" behaviour of properly replicating
> RNG draws from R in C++.
>
> Dirk
>
> |
> | Marie
> |
> | _______________________________________________
> | 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
>



More information about the Rcpp-devel mailing list