web-dev-qa-db-ja.com

オブジェクトがベクトルかどうかをテストする方法

オブジェクトがベクトルかどうかをテストする方法、つまりモードlogicalnumericcomplexまたはcharacteris.vectorの問題は、リストおよびおそらく他のタイプに対してTRUEも返すことです。

> is.vector(list())
[1] TRUE

プリミティブ型のベクトルかどうかを知りたい。これにネイティブな方法はありますか、それともストレージモードで行う必要がありますか?

25
Jeroen

プリミティブ関数のみがあるため、ベクトルがアトミック型の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")
29
Joshua Ulrich

おそらく最適ではないかもしれませんが、作業は行われます。変数がベクトルであるかどうか、およびリストではないかどうかを確認します。次に、is.vectorの結果をバイパスします。

if(is.vector(someVector) & !is.list(someVector)) { 
  do something with the vector 
}
6
Diego Aviles