1. 学ぶ
  2. /
  3. コース
  4. /
  5. 効率的なRコードの書き方

Connected

演習

& の代わりに && を使う

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 は必ず x と y の両方を計算しようとします。これは非効率になる場合があります。たとえば、x が FALSE のとき、x & y は y の値に関わらず常に FALSE です。このとき y を計算しないほうが少し処理時間を節約できます。&& 演算子はこの性質を利用しており、結果に影響がない場合は y を計算しません。

このコードでは、is_double[1] が FALSE なら、is_double[2] と is_double[3] を評価する必要はありません。したがって、& を && に置き換えることで高速化できます。

注意点として、&& は単一の論理値、すなわち長さ 1 の論理ベクトル(if 条件に渡すようなもの)にしか使えませんが、& は長さが 1 より大きいベクトルにも使えます。

指示

100 XP
  1. improved_move() 関数を作成します。move() と同様ですが、&& を使うようにします。
  2. microbenchmark() を使って、improved_move() と従来の move() を比較します。