Використовуйте && замість &
Щоб визначити, чи обидва кубики показали однакову кількість очок, функція 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
Інструкції до вправи
- Створіть функцію
improved_move(), подібну доmove(), але з використанням&&. - За допомогою
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)