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:1000000) >>> >>> creates a vector of length 1000000 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.