web-dev-qa-db-fra.com

Comment tester si l'objet est un vecteur

Comment tester si un objet est un vecteur, c'est-à-dire le mode logical, numeric, complex ou character? Le problème avec is.vector est qu'il renvoie également TRUE pour les listes et peut-être d'autres types:

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

Je veux savoir si c'est un vecteur de types primitifs. Existe-t-il une méthode native pour cela, ou dois-je passer par le mode de stockage?

25
Jeroen

Il n'y a que des fonctions primitives, donc je suppose que vous voulez savoir si le vecteur est l'un des types atomiques. Si vous voulez savoir si un objet est atomique, utilisez 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

Si vous n'êtes intéressé que par le sous-ensemble des types atomiques que vous mentionnez, il serait préférable de les tester explicitement:

mode(foo) %in% c("logical","numeric","complex","character")
29
Joshua Ulrich

Peut-être pas optimal, mais il fera le travail: vérifiez si la variable est un vecteur ET si ce n'est pas une liste. Ensuite, vous contournez le is.vector résultat:

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