Re: [R] crazy loop error.
On Tue, Jan 25, 2011 at 08:58:31AM +, Prof Brian Ripley wrote: [...] If k may be 0, then it is better to use for (n in seq(length=k)) since seq(length=0) has length 0. Since you keep mentioning that, it is actually much better to use seq_len(k) (and seq_along(x) instead of your earlier recommendation of seq(along=x)). And if you are using seq() in other cases in programs, consider seq.int() instead. Thank you for pointing out the functions seq_len(), seq_along() and seq.int(). These functions are primitive and faster, as others already mentioned. Using replicate(), i obtained on my computer a speed up by a factor between 5 and 7 for k = 20 and there is a remarkable speed up also for larger k. The function seq.int() is more general than the other two. In particular, it can generate also a decreasing sequence. Petr Savicky. __ R-help@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.
Re: [R] crazy loop error.
On Mon, Jan 24, 2011 at 11:18:35PM +0100, Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. The error resulting in the NA was pretty easy to fix, and my loop works, but the results are still wrong (new script below). Ideally it should print single hello for the single letters and grouped '3 hellos' for the fives, grouped '2 hellos' for the sixes etc. Based on the run results, if the value of n is being tracked, it changes quite unpredictably. Can someone explain how the value of n changes from end of the loop to the top without anything being done to it? Hi. A for-loop in R is different from a for-loop in C. It is similar to foreach loop in Perl. If v is a vector, then for (n in v) first creates the vector v and then always performs length(v) iterations. Before iteration i, n is assigned v[i] even if n is changed in the previous iteration. If you want to control the loop variable during execution, it is possible to use a while loop, where you have full control. While loop may be better also if v has a very large length, since, for example for (n in 1:100) creates a vector of length 100 in memory. It should also be noted that the for-loop for (n in 1:k) performs 2 iterations, if k is 0, since 1:0 is a vector of length 2. If k may be 0, then it is better to use for (n in seq(length=k)) since seq(length=0) has length 0. Hope this helps. Petr Savicky. __ R-help@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.
Re: [R] crazy loop error.
Hi r-help-boun...@r-project.org napsal dne 24.01.2011 23:18:35: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. The error resulting in the NA was pretty easy to fix, and my loop works, but the results are still wrong (new script below). Ideally it should print single hello for the single letters and grouped '3 hellos' for the fives, grouped '2 hellos' for the sixes etc. Based on the run results, if the value of n is being tracked, it changes quite unpredictably. Can someone explain how the value of n changes from end of the loop to the top without anything being done to it? Put it into a foo function and make use debug(fun()) Regards Petr BTW mapply solution is shorter and probably quicker and easier to maintain. I cannot figure out what I am doing wrong. a-c(2,3,5,5,5,6,6,7) for(n in 1:length(a)) { print(paste(n: ,n)) z1-a[n] print(paste(z1:,z1)) #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 if(nlength(a)) { break; } } print(--End of while loop---) for(y in 1:length(ldata)) { print(ldata[[y]]) } print(paste(n: ,n)) print(**End of for loop) } Thanks, Roy [[alternative HTML version deleted]] __ R-help@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. __ R-help@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.
Re: [R] crazy loop error.
On Tue, 25 Jan 2011, Petr Savicky wrote: On Mon, Jan 24, 2011 at 11:18:35PM +0100, Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. The error resulting in the NA was pretty easy to fix, and my loop works, but the results are still wrong (new script below). Ideally it should print single hello for the single letters and grouped '3 hellos' for the fives, grouped '2 hellos' for the sixes etc. Based on the run results, if the value of n is being tracked, it changes quite unpredictably. Can someone explain how the value of n changes from end of the loop to the top without anything being done to it? Hi. A for-loop in R is different from a for-loop in C. It is similar to foreach loop in Perl. If v is a vector, then for (n in v) first creates the vector v and then always performs length(v) iterations. Before iteration i, n is assigned v[i] even if n is changed in the previous iteration. And also if v is changed during the loop. If you want to control the loop variable during execution, it is possible to use a while loop, where you have full control. While loop may be better also if v has a very large length, since, for example for (n in 1:100) creates a vector of length 100 in memory. It should also be noted that the for-loop for (n in 1:k) performs 2 iterations, if k is 0, since 1:0 is a vector of length 2. If k may be 0, then it is better to use for (n in seq(length=k)) since seq(length=0) has length 0. Since you keep mentioning that, it is actually much better to use seq_len(k) (and seq_along(x) instead of your earlier recommendation of seq(along=x)). And if you are using seq() in other cases in programs, consider seq.int() instead. Hope this helps. Petr Savicky. -- Brian D. Ripley, rip...@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UKFax: +44 1865 272595 __ R-help@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.
Re: [R] crazy loop error.
On Tue, Jan 25, 2011 at 09:05:03AM +0100, Petr Savicky wrote: [...] to foreach loop in Perl. If v is a vector, then for (n in v) first creates the vector v and then always performs length(v) iterations. I forgot that ‘break’ may stop the loop. See ?for for further information. In particular, it says You can assign to ‘var’ within the body of the loop, but this will not affect the next iteration. Petr Savicky. __ R-help@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.
Re: [R] crazy loop error.
Dear Erik, Thanks for the mapply idea. I never got around to understand all those apply functions. I am still curious as to why the other loop didnt work. I even tried the debug but doesnt help. Anyway I will leave that for now. Thanks a lot for your help. Regards, Roy On Mon, Jan 24, 2011 at 11:43 PM, Erik Iverson er...@ccbr.umn.edu wrote: Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. Is this the idea you're trying to execute? It uses ?rle and ?mapply. a - c(2,3,5,5,5,6,6,7) mapply(rep, hello, rle(a)$lengths, USE.NAMES = FALSE) [[1]] [1] hello [[2]] [1] hello [[3]] [1] hello hello hello [[4]] [1] hello hello [[5]] [1] hello -- Best Regards, Roy [[alternative HTML version deleted]] __ R-help@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.
Re: [R] crazy loop error.
Mr Ripley, May I ask why seq_len() and seq_along() are better than seq()? Thanks, Ivan Le 1/25/2011 09:58, Prof Brian Ripley a écrit : On Tue, 25 Jan 2011, Petr Savicky wrote: On Mon, Jan 24, 2011 at 11:18:35PM +0100, Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. The error resulting in the NA was pretty easy to fix, and my loop works, but the results are still wrong (new script below). Ideally it should print single hello for the single letters and grouped '3 hellos' for the fives, grouped '2 hellos' for the sixes etc. Based on the run results, if the value of n is being tracked, it changes quite unpredictably. Can someone explain how the value of n changes from end of the loop to the top without anything being done to it? Hi. A for-loop in R is different from a for-loop in C. It is similar to foreach loop in Perl. If v is a vector, then for (n in v) first creates the vector v and then always performs length(v) iterations. Before iteration i, n is assigned v[i] even if n is changed in the previous iteration. And also if v is changed during the loop. If you want to control the loop variable during execution, it is possible to use a while loop, where you have full control. While loop may be better also if v has a very large length, since, for example for (n in 1:100) creates a vector of length 100 in memory. It should also be noted that the for-loop for (n in 1:k) performs 2 iterations, if k is 0, since 1:0 is a vector of length 2. If k may be 0, then it is better to use for (n in seq(length=k)) since seq(length=0) has length 0. Since you keep mentioning that, it is actually much better to use seq_len(k) (and seq_along(x) instead of your earlier recommendation of seq(along=x)). And if you are using seq() in other cases in programs, consider seq.int() instead. Hope this helps. Petr Savicky. -- Ivan CALANDRA PhD Student University of Hamburg Biozentrum Grindel und Zoologisches Museum Abt. Säugetiere Martin-Luther-King-Platz 3 D-20146 Hamburg, GERMANY +49(0)40 42838 6231 ivan.calan...@uni-hamburg.de ** http://www.for771.uni-bonn.de http://webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php __ R-help@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.
Re: [R] crazy loop error.
ooh.. I have another question. What if I want to add the value in the vector a to the hello each time it prints. Here is your output a - c(2,3,5,5,5,6,6,7) mapply(rep, hello, rle(a)$lengths, USE.NAMES = FALSE) [[1]] [1] hello [[2]] [1] hello [[3]] [1] hello hello hello [[4]] [1] hello hello [[5]] [1] hello If I want something like this, based on values in vector a. [[1]] [1] hello 2 [[2]] [1] hello 3 [[3]] [1] hello 5 hello 5 hello 5 [[4]] [1] hello 6 hello 6 [[5]] [1] hello 7 What i am actually doing is hmm.. I have a bunch of text files which is output from another program. I want to extract some specific information from these files and write to a new file and save it. All these files have a certain variable k which maybe 2, or 3 or 5 etc. The vector a shows the k values of 8 of such files. I want the contents of all files with k value 5 to be written into one file. Thanks, Roy On Mon, Jan 24, 2011 at 11:43 PM, Erik Iverson er...@ccbr.umn.edu wrote: Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. Is this the idea you're trying to execute? It uses ?rle and ?mapply. a - c(2,3,5,5,5,6,6,7) mapply(rep, hello, rle(a)$lengths, USE.NAMES = FALSE) [[1]] [1] hello [[2]] [1] hello [[3]] [1] hello hello hello [[4]] [1] hello hello [[5]] [1] hello -- Best Regards, Roy [[alternative HTML version deleted]] __ R-help@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.
Re: [R] crazy loop error.
Hi r-help-boun...@r-project.org napsal dne 25.01.2011 10:58:36: ooh.. I have another question. What if I want to add the value in the vector a to the hello each time it prints. Here is your output a - c(2,3,5,5,5,6,6,7) mapply(rep, hello, rle(a)$lengths, USE.NAMES = FALSE) [[1]] [1] hello [[2]] [1] hello [[3]] [1] hello hello hello [[4]] [1] hello hello [[5]] [1] hello If I want something like this, based on values in vector a. Not sure how to use mapply test-vector(list, 5) lll-rle(a) for (i in seq_along(lll$lengths)) test[[i]] - rep(paste(hello, lll$values[i]), lll$lengths[i]) [[1]] [1] hello 2 [[2]] [1] hello 3 [[3]] [1] hello 5 hello 5 hello 5 [[4]] [1] hello 6 hello 6 [[5]] [1] hello 7 What i am actually doing is hmm.. I have a bunch of text files which is output from another program. I want to extract some specific information from these files and write to a new file and save it. All these files have a certain variable k which maybe 2, or 3 or 5 etc. The vector a shows the k values of 8 of such files. I want the contents of all files with k value 5 to be written into one file. That is rather vague description. Does those files have some structure? How do you know the variable k? Loops are not so ineffective if you use them for what they are good and if you do not expand the object within loop. See R-Inferno from P.Burns. Regards Petr Thanks, Roy On Mon, Jan 24, 2011 at 11:43 PM, Erik Iverson er...@ccbr.umn.edu wrote: Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. Is this the idea you're trying to execute? It uses ?rle and ?mapply. a - c(2,3,5,5,5,6,6,7) mapply(rep, hello, rle(a)$lengths, USE.NAMES = FALSE) [[1]] [1] hello [[2]] [1] hello [[3]] [1] hello hello hello [[4]] [1] hello hello [[5]] [1] hello -- Best Regards, Roy [[alternative HTML version deleted]] __ R-help@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. __ R-help@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.
Re: [R] crazy loop error.
Well, I'm not Prof. Ripley, but the answer is: Look at the code. seq_len, seq.int, and seq_along call Primitives, which are implemented in C, and therefore MUCH faster than seq(), which is implemented as pure R code (and is also a generic, so requires method dispatch). Though for small n (up to a few thousand, say), it probably doesn't make much difference.(Here, to be corrected by Prof. Ripley is needed). -- Bert On Tue, Jan 25, 2011 at 2:22 AM, Ivan Calandra ivan.calan...@uni-hamburg.de wrote: Mr Ripley, May I ask why seq_len() and seq_along() are better than seq()? Thanks, Ivan Le 1/25/2011 09:58, Prof Brian Ripley a écrit : On Tue, 25 Jan 2011, Petr Savicky wrote: On Mon, Jan 24, 2011 at 11:18:35PM +0100, Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. The error resulting in the NA was pretty easy to fix, and my loop works, but the results are still wrong (new script below). Ideally it should print single hello for the single letters and grouped '3 hellos' for the fives, grouped '2 hellos' for the sixes etc. Based on the run results, if the value of n is being tracked, it changes quite unpredictably. Can someone explain how the value of n changes from end of the loop to the top without anything being done to it? Hi. A for-loop in R is different from a for-loop in C. It is similar to foreach loop in Perl. If v is a vector, then for (n in v) first creates the vector v and then always performs length(v) iterations. Before iteration i, n is assigned v[i] even if n is changed in the previous iteration. And also if v is changed during the loop. If you want to control the loop variable during execution, it is possible to use a while loop, where you have full control. While loop may be better also if v has a very large length, since, for example for (n in 1:100) creates a vector of length 100 in memory. It should also be noted that the for-loop for (n in 1:k) performs 2 iterations, if k is 0, since 1:0 is a vector of length 2. If k may be 0, then it is better to use for (n in seq(length=k)) since seq(length=0) has length 0. Since you keep mentioning that, it is actually much better to use seq_len(k) (and seq_along(x) instead of your earlier recommendation of seq(along=x)). And if you are using seq() in other cases in programs, consider seq.int() instead. Hope this helps. Petr Savicky. -- Ivan CALANDRA PhD Student University of Hamburg Biozentrum Grindel und Zoologisches Museum Abt. Säugetiere Martin-Luther-King-Platz 3 D-20146 Hamburg, GERMANY +49(0)40 42838 6231 ivan.calan...@uni-hamburg.de ** http://www.for771.uni-bonn.de http://webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php __ R-help@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. -- Bert Gunter Genentech Nonclinical Biostatistics __ R-help@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.
Re: [R] crazy loop error.
Now I understand what the difference between a primitive and a non-primitive! Thanks for the clarification! Ivan Le 1/25/2011 18:03, Bert Gunter a écrit : Well, I'm not Prof. Ripley, but the answer is: Look at the code. seq_len, seq.int, and seq_along call Primitives, which are implemented in C, and therefore MUCH faster than seq(), which is implemented as pure R code (and is also a generic, so requires method dispatch). Though for small n (up to a few thousand, say), it probably doesn't make much difference.(Here, to be corrected by Prof. Ripley is needed). -- Bert On Tue, Jan 25, 2011 at 2:22 AM, Ivan Calandra ivan.calan...@uni-hamburg.de wrote: Mr Ripley, May I ask why seq_len() and seq_along() are better than seq()? Thanks, Ivan Le 1/25/2011 09:58, Prof Brian Ripley a écrit : On Tue, 25 Jan 2011, Petr Savicky wrote: On Mon, Jan 24, 2011 at 11:18:35PM +0100, Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. The error resulting in the NA was pretty easy to fix, and my loop works, but the results are still wrong (new script below). Ideally it should print single hello for the single letters and grouped '3 hellos' for the fives, grouped '2 hellos' for the sixes etc. Based on the run results, if the value of n is being tracked, it changes quite unpredictably. Can someone explain how the value of n changes from end of the loop to the top without anything being done to it? Hi. A for-loop in R is different from a for-loop in C. It is similar to foreach loop in Perl. If v is a vector, then for (n in v) first creates the vector v and then always performs length(v) iterations. Before iteration i, n is assigned v[i] even if n is changed in the previous iteration. And also if v is changed during the loop. If you want to control the loop variable during execution, it is possible to use a while loop, where you have full control. While loop may be better also if v has a very large length, since, for example for (n in 1:100) creates a vector of length 100 in memory. It should also be noted that the for-loop for (n in 1:k) performs 2 iterations, if k is 0, since 1:0 is a vector of length 2. If k may be 0, then it is better to use for (n in seq(length=k)) since seq(length=0) has length 0. Since you keep mentioning that, it is actually much better to use seq_len(k) (and seq_along(x) instead of your earlier recommendation of seq(along=x)). And if you are using seq() in other cases in programs, consider seq.int() instead. Hope this helps. Petr Savicky. -- Ivan CALANDRA PhD Student University of Hamburg Biozentrum Grindel und Zoologisches Museum Abt. Säugetiere Martin-Luther-King-Platz 3 D-20146 Hamburg, GERMANY +49(0)40 42838 6231 ivan.calan...@uni-hamburg.de ** http://www.for771.uni-bonn.de http://webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php __ R-help@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. -- Ivan CALANDRA PhD Student University of Hamburg Biozentrum Grindel und Zoologisches Museum Abt. Säugetiere Martin-Luther-King-Platz 3 D-20146 Hamburg, GERMANY +49(0)40 42838 6231 ivan.calan...@uni-hamburg.de ** http://www.for771.uni-bonn.de http://webapp5.rrz.uni-hamburg.de/mammals/eng/1525_8_1.php __ R-help@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.
[R] crazy loop error.
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@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.
Re: [R] crazy loop error.
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@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. __ R-help@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.
Re: [R] crazy loop error.
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. __ R-help@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.
Re: [R] crazy loop error.
Roy Mathew wrote: Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. Is this the idea you're trying to execute? It uses ?rle and ?mapply. a - c(2,3,5,5,5,6,6,7) mapply(rep, hello, rle(a)$lengths, USE.NAMES = FALSE) [[1]] [1] hello [[2]] [1] hello [[3]] [1] hello hello hello [[4]] [1] hello hello [[5]] [1] hello __ R-help@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.
Re: [R] crazy loop error.
Thanks for the reply Erik, As you mentioned, grouping consecutive elements of 'a' was my idea. I am unaware of any R'ish way to do it. It would be nice if someone in the community knows this. The error resulting in the NA was pretty easy to fix, and my loop works, but the results are still wrong (new script below). Ideally it should print single hello for the single letters and grouped '3 hellos' for the fives, grouped '2 hellos' for the sixes etc. Based on the run results, if the value of n is being tracked, it changes quite unpredictably. Can someone explain how the value of n changes from end of the loop to the top without anything being done to it? I cannot figure out what I am doing wrong. a-c(2,3,5,5,5,6,6,7) for(n in 1:length(a)) { print(paste(n: ,n)) z1-a[n] print(paste(z1:,z1)) #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 if(nlength(a)) { break; } } print(--End of while loop---) for(y in 1:length(ldata)) { print(ldata[[y]]) } print(paste(n: ,n)) print(**End of for loop) } Thanks, Roy [[alternative HTML version deleted]] __ R-help@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.