[R] Creating a loop that works....

Uwe Ligges ligges at statistik.uni-dortmund.de
Tue Jul 1 09:36:05 CEST 2003


Please don't send messages twice (to r-help at ... and R-help at ...).
I'm not going to read all your code, understand your problems and write 
your programs. That's probably the right job for a consultant, or a 
programmer at your department.

Uwe Ligges


Michael Rennie wrote:

> Hi there,
> 
> First off, thanks to everyone who has helped me so far.  Sorry to keep 
> pestering you all.
> 
> I'm including my code here, and I will comment down it where it is that I am 
> having problems figuring out how to write this damn thing.
> 
> 
> 
>>temper <- scan("temp2.dat", na.strings = ".", list(Day=0, Temp=0))
> 
> Read 366 records
> 
>>Day <- temper$Day ; Temp<-temper$Temp ; 
>>
>>temp<- cbind (Day, Temp)
>>#Day = number of days modelled, Temp = daily avg. temp.
>>#temp [,2]
>>
>>p<- 0.558626306252032
>>ACT <- 1.66764519286918
>>
>>Vc<-((CTM-temp[,2])/(CTM-CTO))
>>Vr<-((RTM-temp[,2])/(RTM-RTO))
>>
>>
>>comp<- cbind (Day, Temp, Vc, Vr)
>>
>>
>>bio<-NULL
>>M<- length(Day) #number of days iterated
>>for (i in 1:M)
> 
> + {
> + 
> + weight<- function(Day)
> + {
> + W<-NULL
> + 	if (Day[i]==1) {W[i] <- Wo}
> + else    if (Day[i]>1) {W[i] <- ((bio[i-1,1]*bio[i-1,9])/Ef)
> + 	}
> + 	W
> + }
> + 
> + W<-weight(Day)
> 
> The problem, as many of you have already identified, is right here. I hope I 
> finally have the syntax right, but even if the "if else" is coded properly, I 
> don't think R can find the values in the second condition I list. I need W in 
> each step of the iteration to change slightly, based on the mess of 
> calculations below (which are using parameters that I have already specified).  
> After all the calculations are made, I hope to get values in bio[i,1] and bio
> [i,9] corresponding to the iteration that just occured, then return to the top 
> of the loop to combine them into the value of W for the next iteration. What I 
> think is happening here is that R is looking for values in the condition before 
> they are actually there- the way I've written it, they can't be there until I 
> get past the conditional step.  Which means I am coding this all wrong.  That 
> said, I'm not sure how else to do it;  the value of W in the next iteration is 
> dependent on the values of Gr and W in the previous iteration, with the 
> exception of the first one (Day=1).  I've tried defining "bio" as 
> 
> bio<-matrix(NA, ncol=9, nrow=366)
> 
> but that doesn't help either.
> 
> Perhaps my rbind at the end of the file is incorrect? I think maybe I'm getting 
> mixed up between calculating vectors and values-- should I be specifying [i] 
> for everything below where I am now specifying vecotrs?  
> 
> + #W<-Wo
> + 
> + C<- p*CA*(W^CB)*((comp[,3]^Xc)*(exp(Xc*(1-comp[,3]))))*Pc
> + 
> + ASMR<- (ACT*RA*(W^(RB))*((comp[,4]^Xa)*(exp(Xa*(1-comp[,4])))))
> + 
> + SMR<- (ASMR/ACT)
> + 
> + A<- (ASMR-SMR)
> + 
> + F<- (FA*(comp[,2]^FB)*(exp(FG*p))*C)
> + 
> + U<- (UA*(comp[,2]^UB)*(exp(UG*p))*(C-F))
> + 
> + SDA<- (S*(C-F))
> + 
> + Gr<- (C-(ASMR+F+U+SDA))
> + #Day, Temp, Vc, Vr, W, C, ASMR, SMR, A, F, U, SDA, Gr)
> + 
> + bio<- rbind(c(W, C, ASMR, SMR, A, F, U, SDA, Gr))
> + 
> + dimnames (bio) <-list(NULL, c
> ("W", "C", "ASMR", "SMR", "A", "F", "U", "SDA", "Gr"))
> + 
> + }
> Error: length of dimnames[2] not equal to array extent
> Execution halted
> 
>




More information about the R-help mailing list