pajul
pajul

Reputation: 133

Error in for loop - attempt to select less than one element in integerOneIndex

I'm trying to translate a C routine from an old sound synthesis program into R, but have indexing issues which I'm struggling to understand (I'm a beginner when it comes to using loops).

The routine creates an exponential lookup table - the vector exptab:

# Define parameters
sinetabsize <- 8192
prop <- 0.8
BP <- 10
BD <- -5
BA <- -1 

# Create output vector
exptab <- vector("double", sinetabsize)

# Loop
while(abs(BD) > 0.00001){
  BY = (exp(BP) -1) / (exp(BP*prop)-1)
  if (BY > 2){
    BS = -1
  }
  else{
    BS = 1
  }
  if (BA != BS){
    BD = BD * -0.5
    BA = BS
    BP = BP + BD
  }
  if (BP <= 0){
    BP = 0.001
  }
  BQ = 1 / (exp(BP) - 1)
  incr = 1 / sinetabsize
  x = 0
  stabsize = sinetabsize + 1
  for (i in (1:(stabsize-1))){
  x = x + incr
  exptab [[sinetabsize-i]] = 1 - (BQ * (exp(BP * x) - 1))
  }
}

Running the code gives the error:

Error in exptab[[sinetabsize - i]] <- 1 - (BQ * (exp(BP * x) - 1)) : 
  attempt to select less than one element in integerOneIndex

Which, I understand from looking at other posts, indicates an indexing problem. But, I'm finding it difficult to work out the exact issue.

I suspect the error may lie in my translation. The original C code for the last few lines is:

for (i=1; i < stabsize;i++){
  x += incr;
  exptab[sinetabsize-i] =  1.0 - (float) (BQ*(exp(BP*x) - 1.0));
}

I had thought the R code for (i in (1:(stabsize-1))) was equivalent to the C code for (i=1; i< stabsize;i++) (i.e. the initial value of i is i = 1, the test is whether i < stabsize, and the increment is +1). But now I'm not so sure.

Any suggestions as to where I'm going wrong would be greatly appreciated!

Upvotes: 0

Views: 2239

Answers (1)

Limey
Limey

Reputation: 12461

As you say, array indexing in R starts at 1. In C it starts at zero. I reckon that's your problem. Can sinetabsize-i ever get to zero?

Upvotes: 2

Related Questions