web-dev-qa-db-ja.com

ifステートメントの論理(0)

この行:

_which(!is.na(c(NA,NA,NA))) == 0
_

logical(0)を生成します

この行

_if(which(!is.na(c(NA,NA,NA))) == 0){print('TRUE')}
_

生成:

_Error in if (which(!is.na(c(NA, NA, NA))) == 0) { : 
  argument is of length zero
_

エラーがあるのはなぜですか?論理とは(0)

6
user1700890

logical(0)は、長さが0の論理クラスのベクトルです。このベクトルのどの要素が0に等しいかを尋ねるので、これを取得しています:

_> !is.na(c(NA, NA, NA))
[1] FALSE FALSE FALSE
> which(!is.na(c(NA, NA, NA))) == 0
logical(0)
_

次の行では、長さゼロのベクトルlogical(0)が0に等しいかどうかを尋ねていますが、そうではありません。長さ0のベクトルとスカラーを比較できないため、エラーが発生しています。

代わりに、その最初のベクトルの長さが0であるかどうかを確認できます。

_if(length(which(!is.na(c(NA,NA,NA)))) == 0){print('TRUE')}
_
9
efbbrown

まず、logical(0)は、ブール値を含むはずのベクターがあるが、ベクターの長さがゼロであることを示します。

最初のアプローチでは、あなたは

_!is.na(c(NA, NA, NA))
# FALSE, FALSE, FALSE
_

このベクトルでwhich()を使用すると、空の整数ベクトル(integer(0))が生成されます。空のセットがゼロに等しいかどうかをテストすると、空のブールベクトルになります。

2番目のアプローチでは、ベクトルwhich(!is.na(c(NA,NA,NA))) == 0TRUEまたはFALSEであるかどうかを確認します。ただし、空なので、どちらでもありません。 if-文には、TRUEまたはFALSEが必要です。それがエラー_argument is of length zero_を与える理由です

5
KenHBS

whichを呼び出して、論理のベクトルがすべてfalseであるかどうかを確認するのは悪い考えです。 whichは、TRUE値のインデックスのベクトルを提供します。存在しない場合、そのベクトルは長さ0です。より良いアイデアは、anyを使用することです。

> any(!is.na(c(NA,NA,NA)))
FALSE
4
AdamO