2013-02-18 8 views
48
  1. Dlaczego TRUE == "TRUE" jest TRUE w R?
  2. Czy istnieje odpowiednik dla === w R?

Aktualizacja:Dlaczego PRAWDA == "PRAWDA" ma wartość PRAWDA w R?

Są to wszystko wraca FALSE:

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

Jedyną wartością TRUE jest TRUE == "TRUE". W przypadku sprawdzania z identical() wszystko działa poprawnie.

Druga aktualizacja:

Przez === operatora mam na myśli proces sprawdzania wartość i Typ danych z zmiennej. W tym przypadku założyłem, że operator == będzie porównywał tylko wartości zmiennych, a nie ich typu danych.

+0

jest '' jest === operator javascript? [The Strict Equality Comparison Algorithm?] (Http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.6) – agstudy

+0

@agstudy Myślę, że w wielu językach składniowych sterowanych przez C, mamy tego operatora zarówno dla wartości i danych kontrola typu w tym samym czasie. Nie jestem pewien innych języków ... – Mahdi

+1

PRAWDA == 1 i PRAWDA == 1,0 i PRAWDA == 1.0000000000000001 (i 0,99999999999999999) są również prawdziwe. Ogólnie rzecz biorąc wszystko, co jest na tyle blisko, aby było 1.0, powinno być zaokrąglone do IEEE754. –

Odpowiedz

53

Według pliku pomocy ?`==`:

Jeżeli oba argumenty są wektory atomowe różnych typów, jeden jest zmuszone do rodzaju drugiej strony (zmniejszenie) Porządek pierwszeństwa będącego charakteru, złożone, numeryczne, całkowite, logiczne i surowe.

Więc TRUE jest zmuszany do "TRUE" (tj. Np. as.character(TRUE)), stąd równości.

Odpowiednik operatora === (czyli są równe i dwa obiekty tego samego typu) będzie funkcja identical:

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

Dzięki za odpowiedź, 'identyczny' działa dobrze, ale' TRUE == "T" 'lub' TRUE == "true" 'jest nadal' FALSE'. Dowolny pomysł? – Mahdi

+2

OK Muszę edytować swoją odpowiedź, ponieważ pomyślałem o niej wstecz: faktycznie '==' przymus do wspólnego typu, a kolejność pierwszeństwa to znak, złożony, numeryczny, całkowity, logiczny i surowy. Tak więc faktycznie jest to PRAWDA, która jest wymuszona na "PRAWDA", a nie odwrotnie, moja zła. – plannapus

+0

Myślę, że teraz ma rację. –

10

prawda i fałsz są zarezerwowane słowa R. Nie sądzę eznme było poprawne (przed edycją), kiedy powiedział, że każda niezerowa wartość jest PRAWDĄ, ponieważ TRUE == "A" ma wartość FALSE. (To byłoby poprawne w wyjaśnieniu dlaczego TRUE == 1 wartość TRUE, ale nie byłoby wyjaśnić wynik dla TRUE == 7

Wyjaśnienie podane przez plannapus zostało wyjęte z kontekstu opisujące zachowanie as.logical. Jest bliżej „prawda”, ponieważ jest niejawny przymus TRUE do charakteru przez operatora == który tworzy ten wynik. Chociaż T i F mają początkowo wartości pRAWDA lub FAŁSZ, mogą zostać przypisane do innych wartości lub typów.

> 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 

(wcześniej niesłusznie napisałem, że wywołany wymuszeniem przez TRUE == "TRUE" było logiczne; to faktycznie poprzez as.character (TRUE) zwracanie "TRUE".)

+0

Poprzedni cytat dotyczył "as.logical", ponieważ założyłem, że '==' jest zmuszony do wspólnego typu, po prostu założyłem niewłaściwą kolejność na pierwszeństwo. Zobacz moją edycję korekty. – plannapus

+0

'od TRUE ==" A "oznacza FALSE': ponieważ są ** różne ** wartości! –

+0

Ale PRAWDA i "PRAWDA" to także różne wartości, w rzeczywistości są to nawet różne tryby. –

3

Oprócz

PRAWDA == "PRAWDA"

to również prawdą

  • PRAWDA == 1
  • PRAWDA == 1,0
  • TRUE == 1.0000000000000001
  • PRAWDA == 0,99999999999999999 itd., Ogólnie wszystkie wartości są wystarczająco bliskie do 1,0 jest zaokrąglone do IEEE754.

Ale co jest bardziej interesing jest to, co if() sprawdza: sprawdza non-false; W rzeczywistości Działki !:

if(4.0) plot(1) 

myślę jedynymi wartościami, które dont wywołać if() są 0, F, fałszywy i "false" Wydają zdefiniowane jako dokładnie 0.

+2

? "Jeśli" wyraźnie stwierdza, że ​​argumenty są wymuszone logicznie. –

+0

Wszystko, co nie jest fałszywe, zostanie zmienione na prawdziwe. Szerokość danych nie jest tu interesująca, warto zauważyć, które oryginalne wartości są odwzorowane na true, a które na false. –

+2

Nie jest prawdą, że wszystkie nie-FALSE będą wymuszone na PRAWDA. NA spowoduje błąd. –

Powiązane problemy