ans <- function(x){
ifelse(x < 0, 2*abs(x), x)
}
будет делать.
> ans(2)
[1] 2
> ans(-2)
[1] 4
Объяснение: Мы можем использовать встроенную функцию R
base ifelse()
.Логика довольно проста:
ifelse(condition, output if condition is TRUE, output if condition is FALSE)
Поэтому ifelse(x < 0, 2*abs(x), x)
сделает следующее:
- оценит, является ли значение x отрицательным (<0)</li>
- если
TRUE
, вернуть 2*abs(x)
- , если
FALSE
, вернуть x
Преимущество ifelse()
перед традиционным if()
это векторизацияif()
может обрабатывать только одно значение, ifelse()
будет оценивать любой вектор, заданный в качестве входного.
Сравнение:
ans_if <- function(x){
if(x < 0){2*abs(x)}else{x}
}
Это та же функция, использующая традиционную if()
состав.Если в качестве входных данных ввести одно значение, результат будет одинаковым для обеих функций:
> ans(-2)
[1] 4
> ans_if(-2)
[1] 4
Но если вы хотите ввести несколько значений, скажем,
test <- c(-1, -2, 3, -4)
вариант ifelse()
оценит каждый элемент вектора и сгенерирует правильный вывод как вектор одинаковой длины:
> ans(test)
[1] 2 4 3 8
, тогда как вариант if()
выдаст предупреждение
> ans_if(test)
[1] 2 4 6 8
Warning message:
In if (x < 0) { :
the condition has length > 1 and only the first element will be used
и вернетневерный вывод, так как для оценки использовалось только первое значение (-1), и операция на всем векторе была основана на этой оценке.