[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){
>>              dyn.load("change_vecA.so");
>>              .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



More information about the R-devel mailing list