web-dev-qa-db-fra.com

Comment attraper un entier (0)?

Disons que nous avons une instruction qui produit integer(0), par exemple.

 a <- which(1:3 == 5)

Quel est le moyen le plus sûr d'attraper cela?

112
Roman Luštrik

C’est la manière de R d’imprimer un vecteur de longueur nulle (un entier), vous pouvez donc vérifier que a a une longueur de 0:

R> length(a)
[1] 0

Il serait peut-être utile de repenser la stratégie que vous utilisez pour identifier quels éléments que vous voulez, mais sans plus de détails spécifiques, il est difficile de suggérer une autre stratégie.

141
Gavin Simpson

Si c'est spécifiquement zéro longueur nombres entiers, alors vous voulez quelque chose comme

is.integer0 <- function(x)
{
  is.integer(x) && length(x) == 0L
}

Vérifiez-le avec:

is.integer0(integer(0)) #TRUE
is.integer0(0L)         #FALSE
is.integer0(numeric(0)) #FALSE

Vous pouvez également utiliser assertive pour cela.

library(assertive)
x <- integer(0)
assert_is_integer(x)
assert_is_empty(x)
x <- 0L
assert_is_integer(x)
assert_is_empty(x)
## Error: is_empty : x has length 1, not 0.
x <- numeric(0)
assert_is_integer(x)
assert_is_empty(x)
## Error: is_integer : x is not of class 'integer'; it has class 'numeric'.
17
Richie Cotton

Peut-être hors sujet, mais R propose deux fonctions intéressantes, rapides et sensibles au vide, permettant de réduire les vecteurs logiques - any et all:

if(any(x=='dolphin')) stop("Told you, no mammals!")
12
mbq
if ( length(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
#[1] "nothing returned for 'a'"

À la réflexion, je pense que tout est plus beau que length(.):

 if ( any(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
 if ( any(a <- 1:3 == 5 ) ) print(a)  else print("nothing returned for 'a'") 
7
42-

Inspiré par la réponse d'Andrie, vous pouvez utiliser identical et éviter tout problème d'attribut en utilisant le fait qu'il s'agit de l'ensemble vide de cette classe d'objet et en le combinant avec un élément de cette classe:

attr(a,"foo")<-"bar"

> identical(1L,c(a,1L))
[1] TRUE

Ou plus généralement:

is.empty <- function(x, mode=NULL){
    if (is.null(mode)) mode <- class(x)
    identical(vector(mode,1),c(x,vector(class(x),1)))
}

b <- numeric(0)

> is.empty(a)
[1] TRUE
> is.empty(a,"numeric")
[1] FALSE
> is.empty(b)
[1] TRUE
> is.empty(b,"integer")
[1] FALSE
6
James