用 && 取代 &
為了判斷兩顆骰子是否相同,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,那麼無論 y 的值為何,x & y 都會是 FALSE。因此,你可以略過不必要的計算來省下一些處理時間。&& 運算子正是利用這個技巧:如果結果不會受影響,它就不會去計算 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)