ПочатиПочніть безкоштовно

Використовуйте && замість &

Щоб визначити, чи обидва кубики показали однакову кількість очок, функція move_square() використовує інструкції if.

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

Оператор & завжди обчислює обидва свої аргументи. Тобто, якщо ви пишете x & y, R завжди намагатиметься з'ясувати, чим є x і y. У деяких випадках це неефективно. Наприклад, якщо x дорівнює FALSE, вираз x & y завжди буде FALSE незалежно від значення y. Отже, можна трохи зекономити час обробки, не обчислюючи його. Оператор && використовує цю ідею і не обчислює y, якщо це не впливає на загальний результат.

У цьому коді, якщо is_double[1] дорівнює FALSE, нам не потрібно обчислювати is_double[2] чи is_double[3], тож можна пришвидшити виконання, замінивши & на &&.

Зверніть увагу, що && працює лише з поодинокими логічними значеннями, тобто з логічними векторами довжини 1 (як ті, що передаються в умову if), тоді як & працює і з векторами довжини більшої за 1.

Ця вправа є частиною курсу

Ефективне програмування R

Переглянути курс

Інструкції до вправи

  1. Створіть функцію improved_move(), подібну до move(), але з використанням &&.
  2. За допомогою microbenchmark() порівняйте improved_move() з попередньою версією move().

Інтерактивна практична вправа

Спробуйте виконати цю вправу, доповнивши цей зразок коду.

# 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)
Редагувати та запускати код