Unter Verwendung if
, ifelse
und`if`
Es gibt verschiedene Möglichkeiten, if-Anweisungen in R. Golf zu machen. Optimale Lösungen können sehr unterschiedlich sein.
Die Grundlagen
if
ist für den Kontrollfluss. Es ist nicht vektorisiert, dh es kann nur Bedingungen der Länge 1 auswerten. Es muss else
(optional) ein else-Wert zurückgegeben werden.
ifelse
ist eine Funktion. Es ist vektorisiert und kann Werte beliebiger Länge zurückgeben. Das dritte Argument (der else-Wert) ist obligatorisch. *
`if`
ist eine Funktion mit der gleichen Syntax wie ifelse
. Es ist weder vektorisiert noch eines der Rückgabeargumente obligatorisch.
* Es ist technisch nicht obligatorisch; ifelse(TRUE,x)
Funktioniert einwandfrei, aber es wird ein Fehler ausgegeben, wenn das dritte Argument leer ist und die Bedingung den Wert 0 ergibt FALSE
. Die Verwendung ist also nur dann sicher, wenn Sie sicher sind, dass die Bedingung immer vorliegt TRUE
, und wenn dies der Fall ist, warum beschäftigen Sie sich dann überhaupt mit einer if-Anweisung?
Beispiele
Diese sind alle gleichwertig:
if(x)y else z # 13 bytes
ifelse(x,y,z) # 13 bytes
`if`(x,y,z) # 11 bytes
Beachten Sie, dass die Leerzeichen else
nicht erforderlich sind, wenn Sie Zeichenfolgen direkt im Code verwenden:
if(x)"foo"else"bar" # 19 bytes
ifelse(x,"foo","bar") # 21 bytes
`if`(x,"foo","bar") # 19 bytes
Bisher `if`
scheint es der Gewinner zu sein, solange wir keine vektorisierten Eingaben haben. Aber was ist mit Fällen, in denen uns der Zustand else egal ist? Angenommen, wir möchten nur Code ausführen, wenn die Bedingung erfüllt ist TRUE
. Für eine Codezeile if
ist in der Regel Folgendes am besten:
if(x)z=f(y) # 11 bytes
ifelse(x,z<-f(y),0) # 19 bytes
`if`(x,z<-f(y)) # 15 bytes
Bei mehreren Codezeilen if
ist immer noch der Gewinner:
if(x){z=f(y);a=g(y)} # 20 bytes
ifelse(x,{z=f(y);a=g(y)},0) # 27 bytes
`if`(x,{z=f(y);a=g(y)}) # 23 bytes
Es gibt auch die Möglichkeit, dass wir uns um die else-Bedingung kümmern und beliebigen Code ausführen möchten, anstatt einen Wert zurückzugeben. In diesen Fällen sind if
und `if`
in der Byteanzahl äquivalent.
if(x)a=b else z=b # 17 bytes
ifelse(x,a<-b,z<-b) # 19 bytes
`if`(x,a<-b,z<-b) # 17 bytes
if(x){z=y;a=b}else z=b # 22 bytes
ifelse(x,{z=y;a=b},z<-b) # 24 bytes
`if`(x,{z=y;a=b},z<-b) # 22 bytes
if(x)a=b else{z=b;a=y} # 22 bytes
ifelse(x,a<-b,{z=b;a=y}) # 24 bytes
`if`(x,a<-b,{z=b;a=y}) # 22 bytes
if(x){z=y;a=b}else{z=b;a=y} # 27 bytes
ifelse(x,{z=y;a=b},{z=b;a=y}) # 29 bytes
`if`(x,{z=y;a=b},{z=b;a=y}) # 27 bytes
Zusammenfassung
Verwenden ifelse
Sie diese Option, wenn Sie eine Länge> 1 eingegeben haben.
Wenn Sie einen einfachen Wert sind Rückkehr anstatt viele Zeilen Code ausgeführt wird , die unter Verwendung von `if`
Funktion ist wahrscheinlich kürzer als eine vollständige if
... else
Aussage.
Wenn Sie nur einen einzigen Wert möchten TRUE
, verwenden Sie if
.
Zur Ausführung von beliebigem Code, `if`
und if
sind in der Regel die gleichen in Bezug auf die Anzahl der Bytes; Ich empfehle vor if
allem, weil es einfacher zu lesen ist.