138

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

これは私の給与水準を超える設計上の選択ですか?

4

9 に答える 9

111

ifelse州の文書:

ifelseの要素がisまたは。のいずれか testから選択された要素で埋められたのと同じ形状の値を返します。yesnotestTRUEFALSE

長さ1のテスト値に合格しているため、長さ1の結果が得られます。より長いテストベクトルに合格すると、より長い結果が得られます。

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

したがって、ブール値のベクトルをテストし、(ベクトル)と引数ifelseから取得した要素で満たされた同じ長さのベクトルを返すという特定の目的を目的としています。yesno

if () {} else {}関数の名前のために、実際には通常の構造だけが必要な場合にこれを使用することは、よくある混乱です。

于 2009-08-26T16:13:52.323 に答える
75

代わりに単純な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
于 2009-11-18T17:27:59.840 に答える
9

ええ、ifelse() は、テストの大きな長いベクトルがあり、それぞれを 2 つのオプションのいずれかにマップしたい場合のために設計されていると思います。たとえば、私はしばしば次のように plot() の色を設定します:

plot(x,y, col = ifelse(x>2,  'red', 'blue'))

テストの非常に長いベクトルがあり、出力のペアが必要な場合は、おそらく or などsapply()を使用できます。plyrllply()

于 2009-08-28T20:30:22.187 に答える
4

これはCathによって提案されたものと同様のアプローチですが、既存の事前に割り当てられたベクトルで機能します

これは、次のget()ようなものを使用することに基づいています。

a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2
于 2018-07-25T20:50:08.830 に答える
2

あなたの場合、if_elsefromを使用する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
于 2019-05-20T17:21:28.613 に答える
0

everydroprで見つかりました:

ifelse(rep(TRUE, length(c(1,2))), c(1,2),c(3,4))
#>[1] 1 2

条件の結果を複製して、目的の長さを返すことができます

于 2020-07-15T02:34:07.663 に答える