2016-05-30 6 views
1

Ich weiß, dass die Syntax einer IF Anweisung in R:Warum kreuzt die `` -Syntax nicht in R in einer 'if-Anweisung'?

if (1==1){ 
    print("this is true") 
} 

Und ich weiß, dass das Zeug zwischen den () sollte zu einem logischen ausgewertet werden. Also, wenn ich versuche, dies:

if (intersect(list(1),list(1,2)) != list()){ 
    print("this is also true") 
} 

ich es erwartet zu arbeiten, da die intersect(list(1),list(1,2)) != list() als logische Art ausgewertet:

intersect(list(1),list(1,2)) == list() 

Bin ich etwas offensichtlich falsch? Vielen Dank.

+1

Der logische Vektor muss die Länge 1 haben, was nicht der Fall ist. Sie können 'Länge (schneiden (Liste (1), Liste (1,2)))> 0 'testen. – Roland

+0

Logisch * Typ *, ja, aber Nulllänge. Dieser Ausdruck muss entweder "WAHR" oder "FALSCH" sein. –

+1

Fragen Sie in diesem Fall nicht, ob die Länge des Schnittpunkts Null ist (wie in 'Länge (Schnittpunkt (Liste (1), Liste (1,2))) == 0')? Beim Vergleichen von Listen wird nicht angezeigt, dass es unterstützt wird, wie in 'list (1,2) == list (1,2)' gibt den Fehler 'Fehler in Liste (1, 2) == Liste (1, 2): Vergleich dieser Typen ist nicht implementiert " – steveb

Antwort

2

Die logischen Operatoren sind nicht zum Vergleichen von Listenobjekten geeignet. Listenobjekte sind ein rekursiver Typ, der für logische Vektoren nicht ohne Verlust struktureller Informationen erzwungen werden kann. Die Funktion zum Vergleichen von Listen ist identical. Es dauerte nicht vernünftig erschien Ihre Operation zu liefern TRUE, da die Kreuzung von list(1) und list(1,2) wäre nicht list() zu erwarten, so invertiert ich den Test Tests zu ermöglichen:

if (!identical(intersect(list(1),list(1,2)), list())) { 
      print("this is also true") 
     } 
#[1] "this is also true" 

Und die Kreuzung list(1) ist:

if (identical(intersect(list(1),list(1,2)), list(1))) { 
    print("this is also true") 
} 
#[1] "this is also true"