As Dirk pointed out to me off-list, I shouldn't reply to email before coffee. It was my mistake - you had indeed used RNGscope properly.
On Wed, Apr 13, 2011 at 8:27 AM, Cedric Ginestet <c.gineste...@googlemail.com> wrote: > Thanks Douglas for being picky! > I have indeed noted that I needed to use b+1 in my codes to produce discrete > uniform variates. However, I am not too sure that I understand how to use > RNGScope properly. I originally referred to the Rcpp Sugar codes provided in > the Rcpp-introduction .pdf document: > > ######################## > RNGScope scope; > return rnorm(10, 0, 100); > ######################## > > Shall I use anything else? > Cheers, > > > On 13/04/11 13:59, Douglas Bates wrote: >> >> On Wed, Apr 13, 2011 at 6:50 AM, Cedric Ginestet >> <c.gineste...@googlemail.com> wrote: >>> >>> Brilliant, Dirk. Thanks for that. >>> Next time, I'll read the Rcpp Sugar .pdf more carefully. >>> Cheers, >> >> Be aware that in both versions you will never return a vector >> containing b, which might be confusing. That is, the argument b >> should be 1 greater than the maximum value in the range from which you >> are drawing. >> >> I would design it so that the upper end point in the runif range was b >> + 1, which means the arguments a and b are the minimum and maximum >> values in the range from which you wish to draw. >> >> Also you forgot to create an instance of the RNGScope class which >> causes the random number generator state to be saved and restored >> properly. >> >> Sorry for being so picky. >> >>> On 13/04/11 12:43, Dirk Eddelbuettel wrote: >>>> >>>> On 13 April 2011 at 12:19, Cedric Ginestet wrote: >>>> | Hi guys, >>>> | >>>> | I want to produce discrete uniform variates within C++ from the >>>> runif() >>>> | function available through Rcpp Sugar. However, I don't seem to be >>>> able >>>> to find >>>> | the appropriate cast in order to return an IntegerVector as opposed to >>>> a >>>> | numeric one. I have naively used int(), but this is clearly not >>>> sufficient. >>>> | >>>> | Any help would be greatly appreciated, >>>> | Ced >>>> | >>>> | ########################################## >>>> | #### Discrete uniform variate. >>>> | src<- ' >>>> | using namespace Rcpp ; >>>> | RNGScope scope; >>>> | int n = as<int>(xn); >>>> | int a = as<int>(xa); >>>> | int b = as<int>(xb); >>>> | IntegerVector vec(n); >>>> | for(int i=0; i<n; ++i) vec[i] = (int)floor(runif(i,a,b)); >>>> | return vec;' >>>> | cxxfun<- cxxfunction(sig=signature(xn="numeric",xa="numeric",xb= >>>> | "numeric"),body=src,plugin="Rcpp",verbose=TRUE) >>>> | cxxfun(10,0,10); >>>> | >>>> | ########################## >>>> | Error in compileCode(f, code, language = language, verbose = verbose) >>>> : >>>> | Compilation ERROR, function(s)/method(s) not created! >>>> file52d217df.cpp: In >>>> | function ?SEXPREC* file52d217df(SEXPREC*, SEXPREC*, SEXPREC*)?: >>>> | file52d217df.cpp:37: error: invalid cast from type >>>> ?Rcpp::sugar::SugarMath_1 >>>> |<true, double, double, Rcpp::Vector<14>, double (*)(double)>? to type >>>> ?int? >>>> | make: *** [file52d217df.o] Error 1 >>>> | ################################################## >>>> >>>> Well as a start maybe try this as your loop: >>>> >>>> for (int i=0; i<n; ++i) { >>>> double tmp = runif(1,a,b)); // why where you using i here? >>>> vec[i] = static_cast<int>(tmp); // C++ static cast >>>> } >>>> >>>> But you do of course understand that >>>> >>>> a) Rcpp sugar can draw an entire vector at once and >>>> >>>> b) Rcpp sugar also has a vectorised floor() function >>>> >>>> right? So with that try >>>> >>>> R> src<- ' >>>> + RNGScope scope; >>>> + int n = as<int>(xn); >>>> + int a = as<int>(xa); >>>> + int b = as<int>(xb); >>>> + IntegerVector vec(n); >>>> + vec = floor(runif(n,a,b)); >>>> + return vec;' >>>> R> cxxfun<- >>>> cxxfunction(sig=signature(xn="numeric",xa="numeric",xb="numeric"), >>>> + body=src,plugin="Rcpp") >>>> R> cxxfun(10,0,10); >>>> [1] 8 5 1 7 0 0 6 9 8 1 >>>> R> >>>> >>>> >>>> Hth, Dirk >>>> >>>> | -- >>>> | Cedric Ginestet >>>> | Centre for Neuroimaging Sciences (L3.04) >>>> | NIHR Biomedical Research Centre >>>> | Department of Neuroimaging >>>> | Institute of Psychiatry, Box P089 >>>> | King's College London >>>> | De Crespigny Park >>>> | London >>>> | SE5 8AF >>>> | >>>> | ---------------------------------------------------------------------- >>>> | _______________________________________________ >>>> | 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 >>>> >>> _______________________________________________ >>> 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 >>> > _______________________________________________ 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