オブジェクトがベクトルかどうかをテストする方法、つまりモードlogical
、numeric
、complex
またはcharacter
? is.vector
の問題は、リストおよびおそらく他のタイプに対してTRUE
も返すことです。
> is.vector(list())
[1] TRUE
プリミティブ型のベクトルかどうかを知りたい。これにネイティブな方法はありますか、それともストレージモードで行う必要がありますか?
プリミティブ関数のみがあるため、ベクトルがアトミック型の1つであるかどうかを知りたいと思います。オブジェクトがアトミックかどうかを知りたい場合は、is.atomic
。
is.atomic(logical())
is.atomic(integer())
is.atomic(numeric())
is.atomic(complex())
is.atomic(character())
is.atomic(raw())
is.atomic(NULL)
is.atomic(list()) # is.vector==TRUE
is.atomic(expression()) # is.vector==TRUE
is.atomic(pairlist()) # potential "gotcha": pairlist() returns NULL
is.atomic(pairlist(1)) # is.vector==FALSE
言及したアトミックタイプのサブセットのみに関心がある場合は、明示的にテストすることをお勧めします。
mode(foo) %in% c("logical","numeric","complex","character")
おそらく最適ではないかもしれませんが、作業は行われます。変数がベクトルであるかどうか、およびリストではないかどうかを確認します。次に、is.vector
の結果をバイパスします。
if(is.vector(someVector) & !is.list(someVector)) {
do something with the vector
}