La fonction f

Soit une matrice :

M <- matrix(head(rivers, 140), 28, 5)

Une chose que nous pourrions vouloir faire c'est calculer pour chaque ligne de M l'exposant a de la somme des éléments supérieurs à n.

En principe, on peut écrire ça de cette manière :

apply(X, 1, function(x, n, a) sum(x[x > n])^a, n = 350, a = 2)

Mais vous faites peut-être partie de ceux qui trouvent la syntaxe function(x, n, a)... est un peu verbeuse. Si c'est la cas, vous pouvez utiliser la fonction f :

f <- function(exp) {
      w <- all.names(substitute(exp), FALSE)
      if(any(w == "x")) w <- c("x", w[w != "x"])
      fo <- alist()
      length(fo) <- length(w) + 1
      names(fo) <- c(w, "call")
      fo[1:length(w)] <- expression(quote())
      fo$call <- substitute(exp)
      res <- as.function(fo)
      res
}

Cet animal-là est conçu pour transformer une expression en fonction anonyme avec pour particularité que si l'une des variables de l'expression exp s'appelle x, alors elle est nécessairement le premier argument de la fonction renvoyées par f.

Par exemple :

> foo <- f((x-y)^2)
> foo(3, 1)
[1] 4

Ce qui permet de raccourcir sensiblement notre appel à apply :

apply(X, 1, f(sum(x[x > n])^a), n = 350, a = 2)

Ou de faire des choses de ce genre :

> f(x+y)(1, 2)
[1] 3

Amusant non ?

Aucun commentaire:

Enregistrer un commentaire