# [Rd] .Call in R

Joris Meys jorismeys at gmail.com
Fri Nov 18 16:45:41 CET 2011

```Because if you calculate the probability and then make uniform values,
nothing guarantees that the sum of those uniform values actually is
larger than 50,000. You only have 50% chance it is, in fact...
Cheers
Joris

On Fri, Nov 18, 2011 at 4:08 PM, Karl Forner <karl.forner at gmail.com> wrote:
> Hi,
>
> A probably very naive remark, but I believe that the probability of sum(
> runif(10000) ) >= 50000 is exactly 0.5. So why not just test that, and
> generate the uniform values only if needed ?
>
>
> Karl Forner
>
> On Thu, Nov 17, 2011 at 6:09 PM, Raymond <gwgc5 at mail.missouri.edu> wrote:
>
>> Hi R developers,
>>
>>    I am new to this forum and hope someone can help me with .Call in R.
>> Greatly appreciate any help!
>>
>>    Say, I have a vector called "vecA" of length 10000, I generate a vector
>> called "vecR" with elements randomly generated from Uniform[0,1]. Both vecA
>> and vecR are of double type. I want to replace elements vecA by elements in
>> vecR only if sum of elements in vecR is greater than or equal to 5000.
>> Otherwise, vecR remain unchanged. This is easy to do in R, which reads
>>    vecA<-something;
>>    vecR<-runif(10000);
>>    if (sum(vecR)>=5000)){
>>       vecA<-vecR;
>>    }
>>
>>
>>    Now my question is, if I am going to do the same thing in R using .Call.
>> How can I achieve it in a more efficient way (i.e. less computation time
>> compared with pure R code above.).  My c code (called "change_vecA.c")
>> using
>> .Call is like this:
>>
>>    SEXP change_vecA(SEXP vecA){
>>         int i,vecA_len;
>>         double sum,*res_ptr,*vecR_ptr,*vecA_ptr;
>>
>>         vecA_ptr=REAL(vecA);
>>         vecA_len=length(vecA);
>>         SEXP res_vec,vecR;
>>
>>         PROTECT(res_vec=allocVector(REALSXP, vec_len));
>>         PROTECT(vecR=allocVector(REALSXP, vec_len));
>>         res_ptr=REAL(res_vec);
>>         vecR_ptr=REAL(vecR);
>>         GetRNGstate();
>>         sum=0.0;
>>         for (i=0;i<vecA_len;i++){
>>              vecR_ptr[i]=runif(0,1);
>>              sum+=vecR_ptr[i];
>>         }
>>         if (sum>=5000){
>>            /*copy vecR to the vector to be returned*/
>>            for (i=0;i<vecA_len;i++){
>>                  res_ptr[i]=vecR_ptr[i];
>>            }
>>         }
>>         else{
>>                /*copy vecA to the vector to be returned*/
>>                for (i=0;i<vecA_len;i++){
>>                      res_ptr[i]=vecA_ptr[i];
>>                }
>>         }
>>
>>         PutRNGstate();
>>         UNPROTECT(2);
>>         resturn(res);
>> }
>> My R wrapper function is
>>        change_vecA<-function(vecA){
>>              .Call("change_vecA",vecA);
>>        }
>>
>>         Now my question is, due to two loops (one generates the random
>> vector and one determines the vector to be returned), can .Call still be
>> faster than pure R code (only one loop to copy vecR to vecA given condition
>> is met)? Or, how can I improve my c code to avoid redundant loops if any.
>> My
>> concern is if vecA is large (say of length 1000000 or even bigger), loops
>> in
>> C code can slow things down.  Thanks for any help!
>>
>>
>>
>>
>>
>> --
>> View this message in context:
>> http://r.789695.n4.nabble.com/Call-in-R-tp4080721p4080721.html
>> Sent from the R devel mailing list archive at Nabble.com.
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

--
Joris Meys
Statistical consultant

Ghent University
Faculty of Bioscience Engineering
Department of Mathematical Modelling, Statistics and Bio-Informatics

tel : +32 9 264 59 87
Joris.Meys at Ugent.be
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php

```