Kullanılması if
, ifelse
ve`if`
R. if-ifadeleri yapmanın birkaç yolu vardır. Golf-optimal çözümler çok değişebilir.
Temeller
if
kontrol akışı içindir. Vektörleştirilmez, yalnızca uzunluk 1'in koşullarını değerlendirebilir else
. (İsteğe bağlı olarak) başka bir değer vermeyi gerektirir .
ifelse
bir fonksiyondur. Vektörleştirilir ve isteğe bağlı uzunluktaki değerleri döndürür. Üçüncü argümanı (başka bir değer) zorunludur. *
`if`
, aynı sözdizimine sahip bir işlevdir ifelse
. Vektörleştirilmez, ya da zorunlu geri dönüş argümanlarından herhangi biri değildir.
* Teknik olarak zorunlu değildir; ifelse(TRUE,x)
iyi çalışıyor, ancak üçüncü argüman boşsa ve koşul değerlendirirse hata verir FALSE
. Bu nedenle, yalnızca koşulun her zaman olduğundan eminseniz TRUE
ve durum buysa, neden if-if ifadesiyle rahatsız ediyorsanız, kullanımı güvenlidir.
Örnekler
Bunların hepsi eşdeğerdir:
if(x)y else z # 13 bytes
ifelse(x,y,z) # 13 bytes
`if`(x,y,z) # 11 bytes
else
Dizeleri doğrudan kodda kullanıyorsanız, etrafındaki boşlukların gerekli olmadığını unutmayın:
if(x)"foo"else"bar" # 19 bytes
ifelse(x,"foo","bar") # 21 bytes
`if`(x,"foo","bar") # 19 bytes
Şimdiye kadar, `if`
vectorized girdi almadığımız sürece kazanan görünüyor. Peki ya diğer durumu umursamadığımız durumlarda? Diyelim ki, eğer şart ise sadece bir kod çalıştırmak istiyoruz TRUE
. Tek bir kod satırı için if
, genellikle
if(x)z=f(y) # 11 bytes
ifelse(x,z<-f(y),0) # 19 bytes
`if`(x,z<-f(y)) # 15 bytes
Birden fazla kod satırı if
için hala kazanan:
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
Orada biz olasılığı da var mı başka durumu hakkında bakım ve her isteğe bağlı kod çalıştırmak yerine bir değer döndürmek istediğiniz yere. Bu gibi durumlarda if
ve `if`
bayt sayısında eşdeğerdir.
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
özet
ifelse
Uzunluk girişi> 1 olduğunda kullanın .
Çok sayıda kod satırı çalıştırmak yerine basit bir değer döndürüyorsanız, `if`
işlevi kullanmak muhtemelen bir tam if
... else
deyiminden daha kısadır .
Sadece ne zaman tek bir değer istiyorsanız TRUE
, kullanın if
.
Keyfi kod yürütmek için `if`
ve if
genellikle bayt sayısı açısından aynıdır; if
Genelde tavsiye ederim çünkü okuması daha kolay.