Zacznij terazZacznij za darmo

Użyj && zamiast &

Aby sprawdzić, czy oba kości mają tę samą wartość, funkcja move_square() używa instrukcji warunkowych.

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

Operator & zawsze sprawdza oba swoje argumenty. Oznacza to, że jeśli wpiszesz x & y, R zawsze spróbuje obliczyć zarówno x, jak i y. W pewnych przypadkach jest to nieefektywne. Na przykład, jeśli x ma wartość FALSE, to x & y zawsze będzie równe FALSE, niezależnie od wartości y. Można zatem zaoszczędzić nieco czasu, rezygnując z obliczania y. Operator && korzysta właśnie z tej właściwości – nie oblicza y, jeśli jego wartość nie wpłynęłaby na końcowy wynik.

W tym kodzie, jeśli is_double[1] ma wartość FALSE, nie trzeba sprawdzać is_double[2] ani is_double[3]. Można więc przyspieszyć działanie kodu, zastępując & operatorem &&.

Warto pamiętać, że && działa tylko na pojedynczych wartościach logicznych, tzn. wektorach logicznych o długości 1 (takich jak te przekazywane do warunku if), natomiast & obsługuje również wektory o długości większej niż 1.

To ćwiczenie jest częścią kursu

Wydajny kod w R

Zobacz kurs

Instrukcje do ćwiczenia

  1. Utwórz funkcję improved_move(), podobną do move(), ale używającą operatora &&.
  2. Używając microbenchmark(), porównaj improved_move() z poprzednią wersją move().

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

# 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)
Edytuj i uruchom kod