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

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...