[R] recursively divide a value to get a sequence

Berwin A Turlach berwin at maths.uwa.edu.au
Wed Jul 9 13:42:34 CEST 2008


G'day all,

On Wed, 09 Jul 2008 20:33:39 +1000
Jim Lemon <jim at bitwrit.com.au> wrote:

> On Wed, 2008-07-09 at 11:40 +0200, Anne-Marie Ternes wrote:
> > Hi,
> > 
> > if given the value of, say, 15000, I would like to be able to divide
> > that value recursively by, say, 5, and to get a vector of a
> > determined length, say 9, the last value being (set to) zero- i.e.
> > like this:
> > 
> > 15000 3000 600 120 24 4.8 0.96 0.192 0
> > 
> > These are in fact concentration values from an experiment. For my
> > script, I get only the starting value (here 15000), and the factor
> > by which concentration is divided for each well, the last one
> > having, by definition, no antagonist at all.
> > 
> > I have tried to use "seq", but it can "only" do positive or negative
> > increment. I didn't either find a way with "rep", "sweep" etc. These
> > function normally start from an existing vector, which is not the
> > case here, I have only got a single value to start with.
> > 
> > I suppose I could do something "loopy", but I'm sure there is a
> > better way to do it.
> > 
> Well, if you really want to do it recursively (and maybe loopy as
> well)
> 
> recursivdiv<-function(x,denom,lendiv,firstpass=TRUE) {
>  if(firstpass) lendiv<-lendiv-1
>  if(lendiv > 1) {
>   divvec<-c(x/denom,recursivdiv(x/denom,denom,lendiv-1,FALSE))
>   cat(divvec,ndiv,"\n")
>  }
>  else divvec<-0
>  if(firstpass) divvec<-c(x,divvec)
>  return(divvec)
> }


Or, a bit more compactly:

recursivdiv <- function(x,denom,lendiv) {
    if(lendiv > 1) {
      divvec<-c(x, Recall(x/denom,denom,lendiv-1))
    }
    else divvec<-0
    return(divvec)
  }

which will continue to work if the function is renamed (say, 
rcd <- recursivdiv) due to the use of Recall()

Cheers,

	Berwin



More information about the R-help mailing list