Как использовать условный оператор и возвращаемое значение для функции в R? - PullRequest
0 голосов
/ 22 февраля 2019

Мне нужно создать функцию: ans (x), которая возвращает значение 2 * abs (x), если x отрицательно, и значение x в противном случае.Какую команду я могу использовать?

Спасибо

1 Ответ

0 голосов
/ 22 февраля 2019
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) сделает следующее:

  1. оценит, является ли значение x отрицательным (<0)</li>
  2. если TRUE, вернуть 2*abs(x)
  3. , если 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), и операция на всем векторе была основана на этой оценке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...