Message-ID: <Pine.A41.4.61b.0411180804320.116790@homer11.u.washington.edu>
Date: 2004-11-18T16:13:48Z
From: Thomas Lumley
Subject: how to rewrite this without a loop ?
In-Reply-To: <419CB545.1000807@ugent.be>
On Thu, 18 Nov 2004, Stijn Lievens wrote:
>
> <code>
> add.fun <- function(perf.data) {
> ss <- 0
> for (i in 0:29) {
> ss <- ss + cor(subset(perf.data, dataset == i)[3], subset(perf.data,
> dataset == i)[7], method = "kendall")
> }
> ss }
> </code>
>
> As one can see this function uses a for-loop. Now chapter 9 of 'An
> introduction to R' tells us that we should avoid for-loops as much as
> possible.
You don't say whether `dataset' is the name of a column in `perf.data'.
Assuming it is, and assuming that 0:29 are all the values of `dataset'
sum(by(perf.data, list(perf.data$dataset),
function(d) cor(d[,3],d[,7], method="kendall")))
would work. If this is faster it will be because you don't call subset()
twice per iteration, rather than because you are avoiding a loop. However
it has other benefits: it doesn't have the variable `i', it doesn't have
to change the value of `ss', and it doesn't have the range of `dataset'
hard-coded into it. These are all clarity optimisations.
-thomas