[R] avoiding a loop

chao gai chaogai at duineveld.demon.nl
Thu Oct 26 17:58:40 CEST 2006


Mark,

This is hardly a one-liner. It will only help you if you call it with large 
objects. If you have 0 in your data it needs even more extending.
Here it is:
myconstruct <- function(aa) {
   aa <- c(1,1,aa,1)
   bb <- cumprod(aa)
   taa <- aa<1
   difftaa <- diff(taa)
   starts <- which(c(FALSE,difftaa==1))
   ends <- which(c(FALSE,difftaa==-1))
   correction <- rep(0,length(aa))
   correction[starts] <- 1/bb[starts-2]
   correction[ends] <- -1/bb[starts-2]
   correction <- cumsum(correction)
   correction[correction==0] <- 1
   correction
   bbcor <- bb*correction
   bbcor[!taa] <- aa[!taa]
   bbcor[c(-1,-2,-length(bbcor))]
}


aa <- runif(10000,min=.5,max=1.5)
system.time(target <- constructLt(aa))
system.time(found <- myconstruct(aa))
identical(target,found)
max(abs(target-found))


> system.time(target <- constructLt(aa))
[1] 0.059 0.001 0.059 0.000 0.000
> system.time(found <- myconstruct(aa))
[1] 0.013 0.000 0.014 0.000 0.000
> identical(target,found)
[1] FALSE
> max(abs(target-found))
[1] 4.440892e-16
>


Appearently the outcome is different is some low decimal, due to other 
calculation method.

Kees




On Tuesday 24 October 2006 20:36, Leeds, Mark (IED) wrote:
> I think I asked a similar question 3 years ago to the  Splus list and I
> think the answer was no or noone answered so noone should spend more
> than 5 minutes on this
> because it could definitely be a waste of time.
>
> My question is whether the function below can be rewritten without a for
> loop. apply is fine if it can be done that way but i doubt it. I call it
> a lot and would
> prefer to not loop.
>
> #-----------------------------------------------------------------------
> --------------------------
>
> constructLt<-function(invector) {
>
> outvector<-invector
>
>  for ( i in 2:length(invector) ) {
>  if ( invector[i] < 1 ) {
>   outvector[i]<-invector[i]*outvector[i-1]
>  }
> }
>
> return(outvector)
>
> }
>
> #-----------------------------------------------------------------------
> -------------------------
> --------------------------------------------------------
>
> This is not an offer (or solicitation of an offer) to buy/sell the
> securities/instruments mentioned or an official confirmation.  Morgan
> Stanley may deal as principal in or own or act as market maker for
> securities/instruments mentioned or may advise the issuers.  This is not
> research and is not from MS Research but it may refer to a research
> analyst/research report.  Unless indicated, these views are the author's
> and may differ from those of Morgan Stanley research or others in the Firm.
>  We do not represent this is accurate or complete and we may not update
> this.  Past performance is not indicative of future returns.  For
> additional information, research reports and important disclosures, contact
> me or see https://secure.ms.com/servlet/cls.  You should not use e-mail to
> request, authorize or effect the purchase or sale of any security or
> instrument, to send transfer instructions, or to effect any other
> transactions.  We cannot guarantee that any such requests received via !
> e-mail will be processed in a timely manner.  This communication is solely
> for the addressee(s) and may contain confidential information.  We do not
> waive confidentiality by mistransmission.  Contact me if you do not wish to
> receive these communications.  In the UK, this communication is directed in
> the UK to those persons who are market counterparties or intermediate
> customers (as defined in the UK Financial Services Authority's rules).
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html and provide commented, minimal,
> self-contained, reproducible code.



More information about the R-help mailing list