CommencezCommencez gratuitement

Utiliser && 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 va toujours tenter de déterminer les valeurs de x et de y. Dans certains cas, c'est inefficace. Par exemple, si x vaut FALSE, alors x & y va toujours retourner FALSE, peu importe la valeur de y. Vous pouvez donc économiser un peu de temps de calcul en évitant cette évaluation. L'opérateur && exploite cette astuce et ne calcule pas y si cela ne change rien au résultat final.

Dans ce code, si is_double[1] est FALSE, nous n'avons pas besoin d'évaluer is_double[2] ni is_double[3]. On peut donc accélérer l'exécution en remplaçant & par &&.

À noter que && ne fonctionne que sur des valeurs logiques uniques, c'est‑à‑dire des vecteurs logiques de longueur 1 (comme ceux que vous passez à une condition if), tandis que & fonctionne aussi sur des vecteurs de longueur supérieure à 1.

Cette activité fait partie du cours

Écrire du code R efficace

Voir le cours

Instructions de l’exercice

  1. Créez une fonction improved_move() semblable à 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 ce code d’exemple.

# 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