Структура if(x==Inf) {} else {}
не работает, потому что if
принимает только вектор длиной один, который будет использоваться для сравнения. Поэтому, если вы предоставляете вектор длиной больше единицы, другие значения игнорируются.
Используйте ifelse()
, поскольку он векторизован, что означает, что он оценивает весь вектор сразу.
Для ваши цели, вам нужно вложенное ifelse()
, так как у вас есть два if
заявления.
РЕДАКТИРОВАТЬ: Благодаря комментарию @linog, мы используем identical(x, Inf)
вместо x==Inf
, Так как идентичный не векторизован и возвращает одно значение, TRUE
или FALSE
, мы используем sapply
для выполнения операции над всем вектором.
x=c(1:10,Inf,-Inf)
rescale01=function(x){
rng=range(x, na.rm=T, finite=T)
result=(x-rng[1])/(rng[2]-rng[1])
result = ifelse(sapply(result, identical, Inf), 1, ifelse(sapply(result, identical, -Inf), -1, result))
return(result)
}
rescale01(x)
[1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444 0.5555556 0.6666667
[8] 0.7777778 0.8888889 1.0000000 1.0000000 -1.0000000