Unter Verwendung if, ifelseund`if`
Es gibt verschiedene Möglichkeiten, if-Anweisungen in R. Golf zu machen. Optimale Lösungen können sehr unterschiedlich sein.
Die Grundlagen
ifist 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.
ifelseist 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 elsenicht 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 ifist 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 ifist 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 ifund `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 ifelseSie 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... elseAussage.
Wenn Sie nur einen einzigen Wert möchten TRUE, verwenden Sie if.
Zur Ausführung von beliebigem Code, `if`und ifsind in der Regel die gleichen in Bezug auf die Anzahl der Bytes; Ich empfehle vor ifallem, weil es einfacher zu lesen ist.