Kullanılması if, ifelseve`if`
R. if-ifadeleri yapmanın birkaç yolu vardır. Golf-optimal çözümler çok değişebilir.
Temeller
ifkontrol 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 .
ifelsebir 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 TRUEve 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
elseDizeleri 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ı ifiç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 ifve `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
ifelseUzunluk 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... elsedeyiminden 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 ifgenellikle bayt sayısı açısından aynıdır; ifGenelde tavsiye ederim çünkü okuması daha kolay.