開始使用免費開始

用 && 取代 &

為了判斷兩顆骰子是否相同,move_square() 函式使用了 if 敘述。

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

& 運算子會一律評估兩個引數。也就是說,如果你輸入 x & y,R 會同時嘗試計算 xy。在某些情況下這樣不夠有效率。例如,若 xFALSE,那麼無論 y 的值為何,x & y 都會是 FALSE。因此,你可以略過不必要的計算來省下一些處理時間。&& 運算子正是利用這個技巧:如果結果不會受影響,它就不會去計算 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)
編輯並執行程式碼