ChallengeR #8 - Solutions

Votre mission consistait donc à trouver un moyen de faire en sorte que :

> x == 0
[1] TRUE
> x + 1 == 2
[1] TRUE
> x / 2 == 1
[1] TRUE
> x
[1] 3
> 3 - x
[1] 3
>

Et vous deviez faire ça sans utiliser d’autres fonctions que celles fournies dans les packages de base de R.

Il y a deux façons de faire ça. La première consiste à modifier le comportement des opérateurs utilisés ci-dessus ; c'est ce qu'on proposé @sassien et @navarre_julien avec, respectivement :

'==' <- function(a,b) {TRUE}
'+' <- function(a,b) {a/3+b}
'/' <- function(a,b) {(a-1)/b}
'-' <- function(a,b) {a}
x <- 3

Ou, plus minimaliste :

x <- 3
'==' <- function(x, y) T
'-' <- function(x, y) y

L'autre, un brin plus ésotérique et proposée par @AlekVladNevski, consiste à faire varier la valeur de x à chaque évaluation avec makeActiveBinding (c'est la solution du quiz de @_ColinFay) :

f = function(){i <<- (i+1)%%4; return(i);}
makeActiveBinding(sym = "x", env = .GlobalEnv, fun = f)
i <- -1

Notez enfin qu'il y a une autre méthode pour faire presque la même chose en utilisant addTaskCallback :

foo <- function(total) {
 i <- 0
 function(expr, value, ok, visible) {
  i <<- i + 1
  x <<- (x + 1) %% 4
  i < total
 }
}

x <- -1
n <- addTaskCallback(foo(10))

Pour Challenger #9, vous voudrez bien me laisser un peu de temps. J’ai du pain sur la planche.

Aucun commentaire:

Enregistrer un commentaire

Cheval de fer, acte II

La première partie est ici. Quand John Kennedy s’y était installé au tout début des années 1790, Manchester n’était encore qu’un gros bour...