Hi David, On 29 May 2011 at 18:02, Silkworth,David J. wrote: | I?ve made a lot of progress working through some simple issues, but this one | effects the cornerstone of my project. | | Below is some sample code that shows my efforts. | | I can set the seed programmatically with any integer variable in the place of | the 20 in ?seed?=20 using the environment method.
You can do that more simply at the R level. So I would just do set.seed(20) fun() # calling the function you defined | The language method could only make a fixed call. I still can?t figure out | what the RNGScope could possibly do. Can you possibly go back and read the list archives? That was discussed at some length when we did most of the sugar work -- in essence it just brings the sane state of the R RNGs to our C++ projects, and then returns it. All automatically witin the scope. | I reviewed the discussion at: | | http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2010-September/ | 001078.html | | This made me realize that I should go ahead and code a simple putcol function | loop when I need to populate a column in a Matrix ?array?. (I had spent some | time looking for such a defined method.) Yes, you should also be able to assign a column directly. There are other examples. | An array or Matrix class would be nice, but for now I seem to be able to find | work-arounds. | | Now I am calling the r-prefixed distributions with success, but this same code | will fail on compile if the rlnorm() function is called. | | src <- ' | Rcpp::RNGScope Scope; | Environment base("package:base"); | Function SetSeed = base["set.seed"]; | int NumRands = 5; | int NumTrials = 3; | Rcpp::NumericVector RandCol(NumRands); | Rcpp::NumericMatrix RandVals(NumRands, NumTrials*2); | SetSeed(Named("seed",20) ); | RandCol=rnorm(NumRands,2,1); | int j=3; | for(int i=0; i<NumRands; i++) { | RandVals(i,j) = RandCol(i); | } | return RandVals; | ' | fun <- cxxfunction(signature(), | src, plugin = "Rcpp") I would write this as follows (forgetting for a moment that you do not need to loop to assign the NumRands values into the matrix): src <- ' Rcpp::RNGScope Scope; int NumRands = 5; int NumTrials = 3; Rcpp::NumericVector RandCol(NumRands); Rcpp::NumericMatrix RandVals(NumRands, NumTrials*2); RandCol = rnorm(NumRands,2,1); int j=3; for (int i=0; i<NumRands; i++) { RandVals(i,j) = RandCol(i); } return RandVals; ' fun <- cxxfunction(signature(), body = src, plugin = "Rcpp", include="#include <Rcpp/stats/random/rlnorm.h>") set.seed(20) fun() so no need for the Language or Enviornment objects. | compile error if rlnorm is called instead of rnorm: | "file3a7d3a6f.cpp:38:28: error: 'rlnorm' was not declared in this scope" | | I looked at the source files and could not figure out why this does not work. I am a little stumped too. I also failed to get it to work. I will take another look later --- this may in fact be a bug. | Fortunately, the environment facility enabled me to have ?work around? success. | | Adding these lines to the front of the code solves the problem for now. | | Environment stats("package:stats"); | Function rlnorm = stats["rlnorm"]; Yes, very good trick to get it from R -- but you should also be able to access the rlnorm functions defined via include/Rcpp/stats/random/rlnorm.h Dirk -- Gauss once played himself in a zero-sum game and won $50. -- #11 at http://www.gaussfacts.com _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel