時々、Rのifelseステートメントがかなり便利であることがわかりました。例えば:
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
しかし、私は次の動作に多少混乱しています。
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
これは私の給与水準を超えるデザインの選択ですか?
時々、Rのifelseステートメントがかなり便利であることがわかりました。例えば:
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
しかし、私は次の動作に多少混乱しています。
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
これは私の給与水準を超えるデザインの選択ですか?
回答:
ifelse
状態のドキュメント:
ifelse
同じ形状の戻り値test
のいずれかから選択される元素で満たされているyes
か、no
の要素かどうかに応じtest
ていますTRUE
か、FALSE
。
長さ1のテスト値を渡すため、長さ1の結果が得られます。長いテストベクトルを渡すと、結果が長くなります。
> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4
これifelse
は、ブール値のベクトルをテストし、(ベクトル)yes
とno
引数から取得した要素で満たされた同じ長さのベクトルを返すという特定の目的のためのものです。
関数名のせいで、通常のif () {} else {}
構成だけが本当に必要なときにこれを使用するのはよくある混乱です。
if (TRUE) c(1,2) else c(3,4)
。
if
代わりに単純なステートメントが必要だと思いますifelse
-Rではif
、制御フロー構造ではなく、値を返すことができます。
> if(TRUE) c(1,2) else c(3,4)
[1] 1 2
> if(FALSE) c(1,2) else c(3,4)
[1] 3 4
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
ものが表示されても、この警告を取り除くにはどうすればよいですか?
req(inputval)
要素が多いことを示しています。単一の値を取得するには、関数any()
またはall()
便利な場合があります。
内で結果を割り当てると、問題を回避できることに注意してくださいifelse
。
ifelse(TRUE, a <- c(1,2), a <- c(3,4))
a
# [1] 1 2
ifelse(FALSE, a <- c(1,2), a <- c(3,4))
a
# [1] 3 4
ifelse()
制御フローの代わりにベクトル化された関数を誤用することを奨励していif ... else ...
ます。条件が単一TRUE
またはFALSE
値の場合、私は次のように記述するa <- if (TRUE) c(1,2) else c(3,4)
か、またはif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
代わりに使用した場合のパフォーマンスの違いを考えていませんif
... else
単一の条件の場合は実際に問題になるifelse
可能性があり、場合によってはコード内で優先される可能性があります(ここで簡単に推測してください)。 ;-)。で道を示したかっただけifelse
です。
ええ、ifelse()は、テストの大きな長いベクトルがあり、それぞれを2つのオプションのいずれかにマップしたい場合のために本当に設計されていると思います。たとえば、私はしばしばplot()の色を次のようにしています:
plot(x,y, col = ifelse(x>2, 'red', 'blue'))
あなたがテストの大きな長いベクトルを持っていたが、出力用のペアを望んでいた場合は、使用できるsapply()
かplyr
のllply()
、おそらく、または何かを。
everydroprで見つかりました:
ifelse(rep(TRUE, length(c(1,2))), c(1,2),c(3,4))
#>[1] 1 2
条件の結果を複製して、目的の長さを返すことができます