2016-05-17 3 views
0
check.num <- function(x){ 
    if(x>0){ 
    print("Greater than or equal to 1") 
    } else if(x==0){ 
    print("Equals zero") 
    } else if(x<0){ 
    print("Less than zero") 
    } else{ 
    print("Confused") 
    } 
} 

check.num(1) 
#Output: [1] "Greater than or equal to 1" 

check.num(0) 
#Output: [1] "Equals zero" 

check.num(-1) 
#Output: [1] "Less than zero" 

Wie geben die folgenden Befehle die Werte zurück? Ich habe im ersten Fall "0" und im zweiten Fall "Confused" erwartet.Wie geschieht das Gießen in R?

check.num("") 
#Output: [1] "Less than zero" 

check.num("kj") 
#Output: [1] "Greater than or equal to 1" 

Antwort

4

Von ?Comparison (oder ?">"):

Wenn die beiden Argumente Atom Vektoren verschiedener Typen sind, ist man dem Typ des anderen dazu gezwungen, dem (niedrigsten) Reihenfolge der Vorrang Sein Charakter, komplex, numerisch, Integer, logisch und roh.

Die Zahl 0 wird zum Charakter wirft das andere Argument ("" oder "kj") passen, so dass wir am Ende mit diesem Vergleichen bis:

"">"0" ## FALSE 
"kj">"0" ## TRUE 

, die, es ist ein lexicographic ist Vergleich.

Es wäre wohl weniger überraschend, wenn ein Vergleich zwischen Zeichen und Zahlen NA ergibt, aber so ist die Sprache nicht definiert.

+0

Danke für die Antwort @Ben Bolker, löste es mein Problem, und ich verstehe das Casting jetzt besser. Ich habe versucht, den folgenden Code zu verstehen, um den lexikographischen Vergleich zu verstehen. if ("" < "0") TRUE sonst FALSE #Output: [1] TRUE if ("kj"> "0") TRUE sonst FALSE #Output: [1] TRUE –

+1

wenn es löst Ihr Problem, das Sie Es wird empfohlen, auf das Häkchen zu klicken, um es zu akzeptieren (Sie brauchen nicht "if (condition) TRUE else FALSE" ..., das nur den gleichen Wert wie '(condition)' –

+0

Thumbs up. Kurze Programmierpraktiken. Danke noch einmal. :) –