Как операторы «если» оценивают ввод? Это относится к вектору в целом или к каждой части вектора в отдельности? - PullRequest
0 голосов
/ 16 июня 2020
x <- c(1:10)

only_even <- function(x){
  if(x %% 2 == 0 && is.na(x) < 1){
    return(x)
  }else{
    print("Not even or real")
  }
}
only_even(x)

Возвращает

"Not even or real"

, даже если в X явно четные числа (1:10).

x <- c(1:10)

only_even <- function(x){
  if(x %% 2 == 0){
    return(x)
  }else{
    print("Not even or real")
  }
}
only_even(x)

Возвращает

Warning message:
In if (x%%2 == 0) { :
  the condition has length > 1 and only the first element will be used

Я смущен обоими результатами. Особенно вторая ошибка: «длина условия> 1, и будет использоваться только первый элемент». Применяется ли при создании операторов if только к вектору / вводу в целом? Вместо того, чтобы рассматривать каждое значение индивидуально? Поэтому я получаю ошибку о том, что условие имеет длину> 1?

1 Ответ

0 голосов
/ 16 июня 2020

Как упоминалось в комментариях, ifelse() - это векторизованная версия if(). Вы правы, что if() предназначен для оценки одного условия - в частности, для оценки первого условия, если оно передано с логическим векторным вводом.

x <- 1:5
y <- rep(3, 5)

ifelse(x > y, "yes", "no")
## [1] "no"  "no"  "no"  "yes" "yes"

if(x > y) "yes" else "no"
## [1] "no"
## Warning message:
## In if (x > y) "yes" else "no" :
##  the condition has length > 1 and only the first element will be used

Of конечно, такие вещи, как any(), all(), и т. д. c. может использоваться для сжатия логического вектора в один логический элемент для использования с vanilla if().

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