I was recently reminded on this list that "Using 1:ncol() is bad practice (seq_len is designed for that purpose)" (Ripley) This triggers the following question: What is "good practice" for 2:ncol(x)? (This is not a joke; in a recursive situation it often makes sense to perform the calculation for the start value i = 1, then continue with a loop over the rest, "the Fortran way";) I usually use if (ncol(x) > 1) for (i in 2:ncol(x)){ .... but I can think of for (i in seq_len(x - 1)){ I <- i + 1 .... and i <- 1 while (i < ncol(x)){ i <- i + 1 .... What is "good practice" (efficient and safe)? G?ran Brostr?m
On 13-12-21 5:57 PM, G?ran Brostr?m wrote:> I was recently reminded on this list that > > "Using 1:ncol() is bad practice (seq_len is designed for that purpose)" > (Ripley) > > This triggers the following question: What is "good practice" for > 2:ncol(x)? (This is not a joke; in a recursive situation it often makes > sense to perform the calculation for the start value i = 1, then > continue with a loop over the rest, "the Fortran way";) > > I usually use > > if (ncol(x) > 1) > for (i in 2:ncol(x)){ > .... > > but I can think of > > for (i in seq_len(x - 1)){ > I <- i + 1 > .... > > and > > i <- 1 > while (i < ncol(x)){ > i <- i + 1 > .... > > What is "good practice" (efficient and safe)?for (i in seq_len(x - 1) + 1) should be efficient and safe. A little less efficient, but clearer would be for (i in seq_len(x)[-1]) Duncan Murdoch
What about seq_len2 <- function(length.out, from=1L) { seq(from=from, length.out=max(0L, length.out-from+1L)) }> lapply(0:4, FUN=seq_len2, from=2L)[[1]] integer(0) [[2]] integer(0) [[3]] [1] 2 [[4]] [1] 2 3 [[5]] [1] 2 3 4 /Henrik On Sat, Dec 21, 2013 at 2:57 PM, G?ran Brostr?m <goran.brostrom at umu.se> wrote:> I was recently reminded on this list that > > "Using 1:ncol() is bad practice (seq_len is designed for that purpose)" > (Ripley) > > This triggers the following question: What is "good practice" for 2:ncol(x)? > (This is not a joke; in a recursive situation it often makes sense to > perform the calculation for the start value i = 1, then continue with a loop > over the rest, "the Fortran way";) > > I usually use > > if (ncol(x) > 1) > for (i in 2:ncol(x)){ > .... > > but I can think of > > for (i in seq_len(x - 1)){ > I <- i + 1 > .... > > and > > i <- 1 > while (i < ncol(x)){ > i <- i + 1 > .... > > What is "good practice" (efficient and safe)? > > G?ran Brostr?m > > ______________________________________________ > 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.