この行:
_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)
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')}
_
まず、logical(0)
は、ブール値を含むはずのベクターがあるが、ベクターの長さがゼロであることを示します。
最初のアプローチでは、あなたは
_!is.na(c(NA, NA, NA))
# FALSE, FALSE, FALSE
_
このベクトルでwhich()
を使用すると、空の整数ベクトル(integer(0)
)が生成されます。空のセットがゼロに等しいかどうかをテストすると、空のブールベクトルになります。
2番目のアプローチでは、ベクトルwhich(!is.na(c(NA,NA,NA))) == 0
がTRUE
またはFALSE
であるかどうかを確認します。ただし、空なので、どちらでもありません。 if
-文には、TRUE
またはFALSE
が必要です。それがエラー_argument is of length zero
_を与える理由です
which
を呼び出して、論理のベクトルがすべてfalseであるかどうかを確認するのは悪い考えです。 which
は、TRUE値のインデックスのベクトルを提供します。存在しない場合、そのベクトルは長さ0です。より良いアイデアは、any
を使用することです。
> any(!is.na(c(NA,NA,NA)))
FALSE