質問

私は時々、かなり重宝する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   testTRUEまたはFALSEです。

あなたは長さ1のテスト値を渡しているので、あなたが長いテストベクトルを渡す場合は、長さ1の結果を得ている、あなたが長い結果が得られます。

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4

ifelseはブール値のベクトルをテストし、(ベクトル)から採取要素yesno引数が充填された同じ長さのベクトルを返す特定の目的のために意図されているようにします。

これは本当にあなただけではなく、通常の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()またはplyrllply()か何かを使用することができます。

ここでキャスによって提案されたものと同様のアプローチがあるが、それは、既存の事前に割り当てられたベクターを用いて作業することができます。

これはとても似get()を使用してに基づいています:

a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2

時には、ユーザーがだけではなく、switchifelse文を必要とします。その場合:

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_elseifelseよりも厳格で、あなたのケースのためのエラーをスローします:

library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top