Dear R-users, This is a loop which is part of a bigger script. I managed to isolate the error in this loop and simplified it to the bare minimum and made it self-contained. a<-c(2,3,4,5,5,5,6,6,6,7) for(n in 1:10) { print(paste("n: ",n)) z1<-a[n] #make a list container ldata<-list() t=1 while(z1==a[n]) { #add dataframes to list ldata[[t]]<-paste("hello") n=n+1 t=t+1 } print("------End of while loop-------") for(y in 1:length(ldata)) { print(ldata[[y]]) } print(paste("n: ",n)) print("******End of for loop********") } This script has a vector "a", for-loop, and a nested while-loop. The for-loop runs from 1 to length of a. At every number of a, it enters the while-loop and a hello is saved into list ldata. If the next number in the vector a is a different number from previous then the while-loop is exited and saved hello is printed. If the next number in vector a is same as before then it loops inside the while-loop and several hellos are printed together. Then run-time error is Error in while (z1 == a[n]) { : missing value where TRUE/FALSE needed Thats because an NA creeps in somewhere. The problem can be seen far before that. The full output from the run is below. A lot of stuff was printed to help with the debugging. At n=4, there are three repeats of 5, therefore hello is printed 3 times. n then becomes 7. Then when the for-loop returns to top, n miraculously becomes 5. Hows that!!?? Then on, everything goes wrong. I cannot figure out the problem. [1] "n: 1" [1] "------End of while loop-------" [1] "hello" [1] "n: 2" [1] "******End of for loop********" [1] "n: 2" [1] "------End of while loop-------" [1] "hello" [1] "n: 3" [1] "******End of for loop********" [1] "n: 3" [1] "------End of while loop-------" [1] "hello" [1] "n: 4" [1] "******End of for loop********" [1] "n: 4" [1] "------End of while loop-------" [1] "hello" [1] "hello" [1] "hello" [1] "n: 7" [1] "******End of for loop********" [1] "n: 5" [1] "------End of while loop-------" [1] "hello" [1] "hello" [1] "n: 7" [1] "******End of for loop********" [1] "n: 6" [1] "------End of while loop-------" [1] "hello" [1] "n: 7" [1] "******End of for loop********" [1] "n: 7" [1] "------End of while loop-------" [1] "hello" [1] "hello" [1] "hello" [1] "n: 10" [1] "******End of for loop********" [1] "n: 8" [1] "------End of while loop-------" [1] "hello" [1] "hello" [1] "n: 10" [1] "******End of for loop********" [1] "n: 9" [1] "------End of while loop-------" [1] "hello" [1] "n: 10" [1] "******End of for loop********" [1] "n: 10" Error in while (z1 == a[n]) { : missing value where TRUE/FALSE needed Mr Stuck-up..... Thanks for any help. Roy [[alternative HTML version deleted]]
Roy, I have no idea what you're actually trying to do here, but it looks like there would be a more natural R'ish way if you're concerned about grouping consecutive elements of 'a'. At any rate, within your while loop, you're incrementing n by 1, and eventually n will be 10, which will be transformed to 11 when you add 1 to it, and a[11] will be NA, thus the error you receive... Roy Mathew wrote:> Dear R-users, > This is a loop which is part of a bigger script. I managed to isolate the > error in this loop and simplified it to the bare minimum and made it > self-contained. > > a<-c(2,3,4,5,5,5,6,6,6,7) > > for(n in 1:10) > { > print(paste("n: ",n)) > z1<-a[n] > #make a list container > ldata<-list() > t=1 > > while(z1==a[n]) > { > > #add dataframes to list > ldata[[t]]<-paste("hello") > > n=n+1 > t=t+1 > > } > print("------End of while loop-------") > > for(y in 1:length(ldata)) > { > print(ldata[[y]]) > } > > print(paste("n: ",n)) > print("******End of for loop********") > } > > > This script has a vector "a", for-loop, and a nested while-loop. > The for-loop runs from 1 to length of a. At every number of a, it enters the > while-loop and a hello is saved into list ldata. > If the next number in the vector a is a different number from previous then > the while-loop is exited and saved hello is printed. > If the next number in vector a is same as before then it loops inside the > while-loop and several hellos are printed together. > > Then run-time error is > > Error in while (z1 == a[n]) { : missing value where TRUE/FALSE needed > > Thats because an NA creeps in somewhere. The problem can be seen far before > that. The full output from the run is below. > A lot of stuff was printed to help with the debugging. At n=4, there are > three repeats of 5, therefore hello is printed 3 times. n then becomes 7. > Then when the for-loop returns to top, n miraculously becomes 5. Hows > that!!?? Then on, everything goes wrong. I cannot figure out the problem. > > [1] "n: 1" > [1] "------End of while loop-------" > [1] "hello" > [1] "n: 2" > [1] "******End of for loop********" > [1] "n: 2" > [1] "------End of while loop-------" > [1] "hello" > [1] "n: 3" > [1] "******End of for loop********" > [1] "n: 3" > [1] "------End of while loop-------" > [1] "hello" > [1] "n: 4" > [1] "******End of for loop********" > [1] "n: 4" > [1] "------End of while loop-------" > [1] "hello" > [1] "hello" > [1] "hello" > [1] "n: 7" > [1] "******End of for loop********" > [1] "n: 5" > [1] "------End of while loop-------" > [1] "hello" > [1] "hello" > [1] "n: 7" > [1] "******End of for loop********" > [1] "n: 6" > [1] "------End of while loop-------" > [1] "hello" > [1] "n: 7" > [1] "******End of for loop********" > [1] "n: 7" > [1] "------End of while loop-------" > [1] "hello" > [1] "hello" > [1] "hello" > [1] "n: 10" > [1] "******End of for loop********" > [1] "n: 8" > [1] "------End of while loop-------" > [1] "hello" > [1] "hello" > [1] "n: 10" > [1] "******End of for loop********" > [1] "n: 9" > [1] "------End of while loop-------" > [1] "hello" > [1] "n: 10" > [1] "******End of for loop********" > [1] "n: 10" > Error in while (z1 == a[n]) { : missing value where TRUE/FALSE needed > > Mr Stuck-up..... > Thanks for any help. > Roy > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org 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.
On Mon, Jan 24, 2011 at 07:16:58PM +0100, Roy Mathew wrote:> Dear R-users, > This is a loop which is part of a bigger script. I managed to isolate the > error in this loop and simplified it to the bare minimum and made it > self-contained. > > a<-c(2,3,4,5,5,5,6,6,6,7) > > for(n in 1:10) > { > print(paste("n: ",n)) > z1<-a[n] > #make a list container > ldata<-list() > t=1 > > while(z1==a[n]) > { > > #add dataframes to list > ldata[[t]]<-paste("hello") > > n=n+1 > t=t+1 > > } > print("------End of while loop-------") > > for(y in 1:length(ldata)) > { > print(ldata[[y]]) > } > > print(paste("n: ",n)) > print("******End of for loop********") > } > > > This script has a vector "a", for-loop, and a nested while-loop. > The for-loop runs from 1 to length of a. At every number of a, it enters the > while-loop and a hello is saved into list ldata. > If the next number in the vector a is a different number from previous then > the while-loop is exited and saved hello is printed. > If the next number in vector a is same as before then it loops inside the > while-loop and several hellos are printed together. > > Then run-time error is > > Error in while (z1 == a[n]) { : missing value where TRUE/FALSE needed > > Thats because an NA creeps in somewhere. The problem can be seen far before > that. The full output from the run is below. > A lot of stuff was printed to help with the debugging. At n=4, there are > three repeats of 5, therefore hello is printed 3 times. n then becomes 7. > Then when the for-loop returns to top, n miraculously becomes 5. Hows > that!!??Hi. The for-loop "for (i in 1:k)" uses an internal index, which counts the repetitions. This is necessary, since the control over a loop like "for (i in c(1,1,1,1))" cannot be based on the variable i only. Hence, changing i does not influence the next iteration of the loop. For example, the following loop always makes m*n repetitions, although using the same variable in nested loops is definitely not suggested. m <- 3 n <- 5 for (i in seq(length=m)) { for (i in seq(length=n)) { cat("*") } cat("\n") } Hope this helps. Petr Savicky.