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?
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.
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'.
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!")
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'")
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