57 votes

Pourquoi est VRAI == "TRUE" dans le R?

Je jouais avec la R de dimanche dernier, et j'ai eu les questions suivantes:

  1. Pourquoi TRUE == "TRUE" est vraie dans R?
  2. Est-il équivalent pour l' === dans la R?

Mise à jour:

Ce sont tous de retour FALSE:

TRUE == "True"
TRUE == "true"
TRUE == "T"

La seule vraie valeur est TRUE == "TRUE".

En cas de contrôle avec identical() tout fonctionne bien.

Deuxième Mise À Jour:

En === opérateur je voulais dire le processus de vérification de la Valeur et le Type de Données d'une variable. Dans ce cas, je suppose que l' == opérateur qu'à comparer les Valeurs des variables, et non pas leur Type de Données .

61voto

plannapus Points 9026

Selon le fichier d'aide ?`==`:

Si les deux arguments sont atomiques vecteurs de types différents, on est contraint de le type de l'autre, le (la diminution) de l'ordre de préséance étant de caractère, complexe, numérique, entier, de la logique et des matières premières.

Donc, TRUE est contrainte d' "TRUE" (j'. e. as.character(TRUE)), d'où l'égalité.

L'équivalent de l'opérateur === (j'. e. sont les deux objets égaux et de même type) serait fonction identical:

identical(TRUE, "TRUE")
[1] FALSE

12voto

BondedDust Points 105234

Le VRAI et le FAUX sont des mots réservés dans R. je ne pense pas que eznme était correcte (avant sa modification) quand il a dit toute valeur non nulle est VRAI, depuis TRUE == "A" a la valeur FALSE. (Qui aurait été correcte dans l'explication de pourquoi TRUE == 1 a la valeur TRUE, mais il ne serait pas expliquer la raison pour TRUE == 7

L'explication donnée par plannapus a été prise hors du contexte de décrire le comportement de l' as.logical. Il est plus proche de la "vérité", parce que c'est la coercition implicite de son caractère, par l' == opérateur qui crée ce résultat. Bien qu' T et F sont d'abord donné les valeurs du VRAI et du FAUX, ils peuvent être réaffectés à d'autres valeurs ou des types.

> TRUE == as.logical( c("TRUE", "T", "true", "True") )
[1] TRUE TRUE TRUE TRUE

>  TRUE == 7
[1] FALSE
> TRUE == as.logical(7)
[1] TRUE
>  TRUE == as.logical("A")
[1] NA

(J'ai incorrectement écrit que la contrainte induite par TRUE == "TRUE" a été à la logique; c'est en fait via comme.caractère(TRUE) renvoie "TRUE".)

3voto

eznme Points 13158

En plus

TRUE == "TRUE"

ce sont aussi vrai:

  • TRUE==1
  • TRUE==1.0
  • TRUE==1.0000000000000001
  • TRUE==0.99999999999999999 etc, en général, toutes les valeurs sont assez proches de 1,0 à être IEEE754-arrondis.

Mais ce qui est plus intéressant est ce qu' if() contrôle: il vérifie non-false; en fait, c'parcelles!:

if(4.0) plot(1) 

Je pense que les seules valeurs qui ne pas déclencher if() 0, F, FAUX et "FAUX" ils semblent défini comme étant exactement 0.

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