CommencerCommencer gratuitement

Utilisez && au lieu de &

Pour déterminer si les deux dés sont identiques, la fonction move_square() utilise des instructions if.

if (is_double[1] & is_double[2] & is_double[3]) {
    current <- 11 # Go To Jail - square 11 == Jail
}

L’opérateur & évalue toujours ses deux arguments. Autrement dit, si vous tapez x & y, R cherchera systématiquement à évaluer x et y. Dans certains cas, cela n’est pas optimal. Par exemple, si x vaut FALSE, alors x & y sera toujours FALSE, quelle que soit la valeur de y. Vous pouvez donc économiser un peu de temps de calcul en n’évaluant pas y. L’opérateur && exploite cette astuce : il n’évalue pas y si cela ne change pas le résultat global.

Dans ce code, si is_double[1] est FALSE, nous n’avons pas besoin d’évaluer is_double[2] ni is_double[3] ; nous pouvons donc gagner en vitesse en remplaçant & par &&.

À noter : && ne fonctionne que sur des valeurs logiques scalaires, c’est‑à‑dire des vecteurs logiques de longueur 1 (comme ceux passés dans une condition if), tandis que & fonctionne aussi sur des vecteurs de longueur supérieure à 1.

Cet exercice fait partie du cours

Écrire du code R efficace

Afficher le cours

Instructions

  1. Créez une fonction improved_move() similaire à move(), mais qui utilise &&.
  2. À l’aide de microbenchmark(), comparez improved_move() à la version précédente move().

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

# Example data
is_double

# Define the previous solution
move <- function(is_double) {
    if (is_double[1] & is_double[2] & is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# Define the improved solution
improved_move <- function(is_double) {
    if (is_double[1] ___ is_double[2] ___ is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# microbenchmark both solutions
# Very occassionally the improved solution is actually a little slower
# This is just random chance
microbenchmark(___, ___, times = 1e5)
Modifier et exécuter le code