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 ?
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 ?
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.
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
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'.
@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.
@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.
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)
.
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
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 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.
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 suivantswhich(1:3==5)
ou pour1:3==5
.0 votes
@BondedDust j'essayais de trouver
integer(0)
que j'ai produit en utilisantwhich
à titre d'exemple.9 votes
Je sais que c'est vieux, mais pourriez-vous, Hadley, expliquer pourquoi il ne faut pas utiliser
which
? Cela me serait très utile pour éviter le mauvais code.0 votes
Peut-être parce qu'elle peut introduire des bogues et qu'elle n'est souvent pas nécessaire ; voir la discussion en bas de page. cette page .