LoslegenKostenlos starten

Verwende && statt &

Um festzustellen, ob beide Würfel gleich sind, verwendet die Funktion move_square() if-Anweisungen.

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

Der Operator & wertet immer beide Argumente aus. Wenn du also x & y schreibst, versucht R stets zu berechnen, was x und y sind. In manchen Fällen ist das ineffizient. Ist zum Beispiel x FALSE, dann ist x & y immer FALSE, unabhängig vom Wert von y. Du kannst dir also etwas Rechenzeit sparen, indem du es gar nicht erst berechnest. Der Operator && nutzt diesen Trick und verzichtet darauf, y zu berechnen, wenn es das Gesamtergebnis nicht beeinflusst.

In diesem Code müssen wir is_double[2] und is_double[3] nicht auswerten, wenn is_double[1] FALSE ist. Daher können wir durch den Austausch von & durch && eine Beschleunigung erreichen.

Beachte dabei: && funktioniert nur mit einzelnen logischen Werten, d. h. mit logischen Vektoren der Länge 1 (so wie du sie in eine if-Bedingung übergibst). & funktioniert hingegen auch mit Vektoren längerer Länge.

Diese Übung ist Teil des Kurses

<Kurs>Effizient R-Code schreiben</Kurs>
Kurs ansehen

Übungsanweisungen

  1. Erstelle eine Funktion improved_move(), die move() ähnelt, aber && verwendet.
  2. Vergleiche mit microbenchmark() die Funktion improved_move() mit der vorherigen Version move().

Interaktive praktische Übung

Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.

# 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)
Code bearbeiten und ausführen