Hi Matteo, this is an interesting post. My assumption is, that as in the first approach you call an R function which is implemented as a pointer (or reference to an R function) this function always has access to the RNG scope. Whereas in the second approach you call nested, which is a CPP-function that implicitly calls the R function (via the R namespace in Rcpp I think). In this case the RNG scope is not accessible and must be made accessible via a further 'RNGScope;' in the function 'nested'. What happens if you do this?
Best Simon On Jun 10, 2013, at 7:52 PM, Matteo Fasiolo <[email protected]> wrote: > Hi all, > > I continued experimenting with setting the R seed from an > Rcpp function. While this code works: > > cppFunction(' > > List myFun(int n, Function foo) > { > RNGScope scope; > > Environment g = Environment::global_env(); > Environment::Binding RandomSeed = g[".Random.seed"]; > IntegerVector someVariable = RandomSeed; > > NumericVector output1(n); > NumericVector output2(n); > > output1 = foo(n); > > RandomSeed = someVariable; > output2 = foo(n); > > return List::create(output1, output2); > } > > ') > > myRnorm <- function(n) > { > rnorm(n) > } > > set.seed(524514) > myFun(10, myRnorm) > > [[1]] > [1] -0.46949481 -0.40449904 1.10377225 -0.94267114 0.71828154 0.44722386 > -0.04653023 0.49021681 -0.68894641 > [10] 0.15505136 > > [[2]] > [1] -0.46949481 -0.40449904 1.10377225 -0.94267114 0.71828154 0.44722386 > -0.04653023 0.49021681 -0.68894641 > [10] 0.15505136 > > If I put another layer of C++: > > > cppFunction(' > NumericVector nested(int n) > { > return rnorm(n); > } > ') > > myRnorm <- function(n) > { > nested(n) > } > > set.seed(524514) > myFun(10, myRnorm) > > [[1]] > [1] -0.46949481 -0.40449904 1.10377225 -0.94267114 0.71828154 0.44722386 > -0.04653023 0.49021681 -0.68894641 > [10] 0.15505136 > > [[2]] > [1] -1.58817318 0.32828207 0.01351185 -0.28672471 0.51732449 -0.10360312 > 0.97944543 -0.16814832 -0.83571146 > [10] -0.43258866 > > This doesn't work any more. Luckily I listened to Dirk's warning about > messing with R RNG, > because this strange "sandwich" (C++ calls R calls C++) is pretty much what I > was going to > do in my application. > > Matteo > > > > _______________________________________________ > Rcpp-devel mailing list > [email protected] > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
_______________________________________________ Rcpp-devel mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
