始める無料で始める

& の代わりに && を使う

2つのサイコロの目が同じかどうかを判定するために、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 のとき、x & yy の値に関わらず常に 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)
コードを編集して実行