web-dev-qa-db-fra.com

R - Comment tester le caractère (0) dans l'instruction IF

J'imagine que c'est incroyablement simple mais je n'arrive pas à trouver la réponse.

J'écris une instruction IF mais le test consiste à savoir si l'objet renvoie une valeur character(0). Je ne sais pas comment gérer character(0) dans l'instruction.

En supposant Test <- character(0) ou une valeur:

if (identical(Pols4,character(0))) {
  print('Empty')
} else {
  print('Not Empty')
}

Cela ne semble toujours pas fonctionner .....

49
Methexis

Utilisez la fonction identical pour vérifier cela.

a <- character(0)
identical(a, character(0))  # returns TRUE

identical(a, "")           # returns FALSE
identical(a, numeric(0))   # returns also FALSE
71
Patrick Roocks

Utilisez la méthode length ():

> check <- function(value) {
+ if (length(value)==0) {
+ print('Empty')
+ } else {
+ print('Not Empty')
+ }
+ }
> check("Hello World")
[1] "Not Empty"
> check("")
[1] "Not Empty"
> check(character(0))
[1] "Empty"
5
amagard

Ajout de la réponse bidirectionnelle obligatoire. Le package rlang a la fonction is_empty(), qui fait exactement ce que vous voulez.

Test <- character(0)
rlang::is_empty(Test)
#[1] TRUE

Cela fonctionne également pour les vecteurs vides qui ne sont pas des caractères. Par exemple, cela fonctionne dans le cas décrit par Patrick Roocks dans les commentaires.

Test <- as.Date(character(0))
rlang::is_empty(Test)
#[1] TRUE

Le chargement du package 'tidyverse' charge également is_empty().

5
Andrew Brēza

Beaucoup de gens oublient que des fonctions comme str_locate_all() require %>$ unlist() ou %>%. [[1]] Ensuite, vous pouvez facilement détecter le caractère (0) avec la fonction length()if > 0 on peut utiliser en toute sécurité la sortie de str_locate_all par exemple.

Exemple:

value <- str_extract_all("kvk :", ascii_digit(8,8)) %>% unlist()
if(length(value) > 0) {
  #dosomething
}
0