[Rcpp-devel] Cast for output of Rcpp Sugar runif()

Cedric Ginestet c.ginestet05 at googlemail.com
Wed Apr 13 13:50:21 CEST 2011


Brilliant, Dirk. Thanks for that.
Next time, I'll read the Rcpp Sugar .pdf more carefully.
Cheers,


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 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