Challenge #2 - Corrigé

Vous deviez donc me coder une fonction capable de calculer la somme des colonnes d’une matrice X quand byrow = FALSE et la somme des lignes quand byrow = TRUE.

La présence de cet argument binaire byrow suggère naturellement une structure de type if(byrow) {…} else {…} et le reste pouvait assez commodément être codé avec une boucle.

Typiquement, vous pouviez faire quelque chose de ce genre :

foo <- function(X, byrow = FALSE) {
 if(byrow) {
  res <- rep(NA, nrow(X))
  for(i in 1:nrow(X)) {
   res[i] <- sum(X[i, ])
  }
 } else {
  res <- rep(NA, ncol(X))
  for(i in 1:ncol(X)) {
   res[i] <- sum(X[, i])
  }
 }
 return(res)
}

Ce qui donne en effet :

> X <- matrix(1, 5, 3)
> foo(X, TRUE)
[1] 3 3 3 3 3
> foo(X, FALSE)
[1] 5 5 5

Cela dit, il y a beaucoup plus court. Dans le corps de votre fonction, vous auriez pu écrire n’importe laquelle de ces lignes :

res <- if(byrow) rowSums(X) else colSums(X)
res <- colSums(if(byrow) t(X) else X)
res <- apply(X, ifelse(byrow, 1, 2), sum)
res <- apply(if(byrow) t(X) else X, 2, sum)

Je sais, c’est énervant mais rassurez-vous, vous n’étiez pas supposés y arriver de cette manière : j’ai tout fait pour vous orienter vers une boucle et vous ne connaissiez pas l’existence de rowSums, colSums et encore moins celle de apply.

Aucun commentaire:

Enregistrer un commentaire