155 votes

Comment attraper integer(0) ?

Disons que nous avons une déclaration qui produit integer(0) par exemple

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

Quel est le moyen le plus sûr de l'attraper ?

0 votes

Je n'aime pas l'idée de le traiter comme une erreur -- en fait, la politique de R de ne pas réduire certains objets vides permet d'éviter de nombreux flux de récupération d'erreurs, et conduit donc à un code beaucoup plus propre.

20 votes

N'utilisez pas "lequel".

2 votes

Vous pouvez tester avec any . Il renverra FALSE dans les cas suivants which(1:3==5) ou pour 1:3==5 .

176voto

Gavin Simpson Points 72349

C'est la façon dont R imprime un vecteur de longueur nulle (un entier), donc vous pourriez tester pour a étant de longueur 0 :

R> length(a)
[1] 0

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

0 votes

Il est peut-être utile de signaler au futur lecteur que length(NULL) == 0 est également TRUE . La réponse de l'utilisateur E Nord serait une option pour tester integer(0) sólo

22voto

Richie Cotton Points 35365

Si c'est spécifiquement une longueur zéro 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 ça.

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'.

6 votes

Vous pourriez simplement utiliser !length(x) plutôt que length(x)==0

4 votes

@James. C'est vrai, mais je ne pense pas qu'il y ait un problème de performance dans un sens ou dans l'autre, et length(x) == 0L se lit plus clairement pour moi.

0 votes

@RichieCotton. Qu'est-ce qui se passe avec 0L au lieu de 0 ? J'ai essayé de le googler, mais je ne trouve rien de pertinent. Désolé pour la nécromancie.

12voto

mbq Points 8963

Peut-être hors sujet, mais R propose deux fonctions agréables, rapides et tenant compte des vides pour réduire les vecteurs logiques -- any y all :

if(any(x=='dolphin')) stop("Told you, no mammals!")

1 votes

Oui, ce serait bien s'il y avait quelque chose comme is.empty parce que certaines fonctions renvoient integer(0) au lieu de NA o NULL . Mais pour l'instant, votre méthode est la plus simple, et fonctionne de manière vectorielle, ce qui est un gros avantage par rapport à la méthode de l'utilisateur final. length(a) .

8voto

James Points 24725

Inspiré par la réponse d'Andrie, vous pourriez 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 le combiner 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

0 votes

Ce n'est pas la réponse la plus simple, mais de loin la plus simple et la plus sûre pour les débutants.

7voto

BondedDust Points 105234
if ( length(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
#[1] "nothing returned for 'a'"

En y réfléchissant, je pense que n'importe laquelle est plus belle 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'")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X