Використовуючи if, ifelseі`if`
Існує декілька способів зробити, якщо твердження в оптимальних рішеннях R. Golf можуть різнитися.
Основи
ifпризначений для контролю потоку. Він не векторизований, тобто може оцінювати лише умови довжини 1. Це вимагає else(необов'язково) повернення іншого значення.
ifelseє функцією. Він векторизований і може повертати значення довільної довжини. Третій аргумент (інше значення) є обов'язковим. *
`if`є функцією, з тим же синтаксисом, що і ifelse. Він не векторизований, і жоден із зворотних аргументів не є обов'язковим.
* Це технічно не є обов'язковим; ifelse(TRUE,x)працює добре, але він видає помилку, якщо третій аргумент порожній і умова оцінюється на FALSE. Тож безпечно використовувати лише тоді, коли ви впевнені, що ця умова є завжди TRUE, і якщо це так, то чому ви навіть не турбуєтесь із заявою if?
Приклади
Всі вони рівноцінні:
if(x)y else z # 13 bytes
ifelse(x,y,z) # 13 bytes
`if`(x,y,z) # 11 bytes
Зауважте, що пробіли навколо elseне потрібні, якщо ви використовуєте рядки безпосередньо в коді:
if(x)"foo"else"bar" # 19 bytes
ifelse(x,"foo","bar") # 21 bytes
`if`(x,"foo","bar") # 19 bytes
Поки `if`виглядає переможцем, доки ми не маємо векторизованих даних. А як щодо випадків, коли нас не хвилює інша умова? Скажімо, ми хочемо виконати якийсь код лише в тому випадку, якщо це умова TRUE. ifЗазвичай лише один рядок коду :
if(x)z=f(y) # 11 bytes
ifelse(x,z<-f(y),0) # 19 bytes
`if`(x,z<-f(y)) # 15 bytes
Для кількох рядків коду ifвсе ще є переможцем:
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
Там також можливість того, де ми дійсно дбаємо про стан ще, і де ми хочемо , щоб виконати довільний код , а не повертати значення. У цих випадках, ifі `if`еквівалентні по лічильнику байтів.
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
Підсумок
Використовуйте, ifelseколи вводиться довжина> 1.
Якщо ви повертаєте просте значення, а не виконуєте багато рядків коду, використання `if`функції, ймовірно, коротше повного if... elseоператора.
Якщо ви просто хочете отримати одне значення TRUE, використовуйте if.
Для виконання довільного коду `if`і, ifяк правило, однакові за кількістю байтів; Рекомендую ifголовним чином тому, що це легше читати.