なぜRのifelse文はベクトルを返すことはできませんか?
-
20-09-2019 - |
質問
私は時々、かなり重宝する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
これは私のpaygrade上のデザインの選択ですか?
解決
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
の簡単な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
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()は本当にあなたがテストの大きな長いベクトルを持っており、二つの選択肢の一つにそれぞれをマッピングしたいときのために設計されていると思います。例えば、私はしばしばこのようにプロットの色を()行います:
plot(x,y, col = ifelse(x>2, 'red', 'blue'))
あなたがテストの大きな長いベクトルを持っていたが、出力のペアを望んでいた場合は、、あなたはおそらく、sapply()
またはplyr
のllply()
か何かを使用することができます。
ここでキャスによって提案されたものと同様のアプローチがあるが、それは、既存の事前に割り当てられたベクターを用いて作業することができます。
これはとても似get()
を使用してに基づいています:
a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2
時には、ユーザーがだけではなく、switch
のifelse
文を必要とします。その場合:
condition <- TRUE
switch(2-condition, c(1, 2), c(3, 4))
#### [1] 1 2
(ケン・ウィリアムズの答えの他の構文オプションである)
使用 `if`、例えば
> `if`(T,1:3,2:4)
[1] 1 2 3
あなたのケースでは、if_else
からdplyr
を使用すると便利だっただろう:if_else
はifelse
よりも厳格で、あなたのケースのためのエラーをスローします:
library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2