принудительное деление на ноль по умолчанию NaN вместо Inf

Мне интересно, может ли быть параметр, который я упускаю из виду, чтобы заставить R возвращать NaN вместо ± Inf при делении на ноль.

Я слишком часто ловлю себя на том, что делаю что-то вроде

 results[is.infinite(results)] <- NaN

Я надеюсь вообще пропустить процесс фильтрации/поиска.


Пример:

### Example:

num <- c(1:5, NA)
denom <- -2:3

quotient <- num / denom
[1] -0.5 -2.0  Inf  4.0  2.5   NA

# desired results
[1] -0.5 -2.0  NaN  4.0  2.5   NA

Простой способ достижения желаемых результатов:

quotient[is.infinite(quotient)] <- NaN

Мне интересно, можно ли избежать этого последнего шага, все еще получая те же желаемые результаты.


person Ricardo Saporta    schedule 18.09.2013    source источник
comment
Это не совсем помогает, но is.finite вернет FALSE для NA, NaN и Inf.   -  person Justin    schedule 18.09.2013
comment
не говоря уже о том, почему R должен ставить Inf. деление на ноль не является инф. это не определено. это должно быть NA. Я надеялся, что ваш вопрос спровоцирует лучшее обсуждение этого поведения.   -  person Elad663    schedule 28.05.2014
comment
@ Elad663 абсолютно прав. Ставить 1/0 = Inf явно неверно. Голосую за то, чтобы обратить на это внимание.   -  person RudePeopleStepOff    schedule 08.05.2015


Ответы (2)


Я бы переключил свой предикат, а не пытался переопределить математику:

 R> is.finite(c(Inf, NA, NaN))    
 [1] FALSE FALSE FALSE 
 R> is.infinite(c(Inf, NA, NaN))   
 [1]  TRUE FALSE FALSE 
 R> is.na(c(Inf, NA, NaN)) 
 [1] FALSE  TRUE  TRUE
 R> 
person Dirk Eddelbuettel    schedule 18.09.2013
comment
Спасибо, Дирк, но я не понимаю, как здесь помогает изменение предиката. Что мне не хватает? - person Ricardo Saporta; 19.09.2013
comment
Вместо того, чтобы устанавливать NaN и затем проверять его, просто проверьте !is.finite(). В долгосрочной перспективе вам будет лучше, поскольку x/0 действительно является Inf для всех положительных x. - person Dirk Eddelbuettel; 19.09.2013
comment
@DirkEddelbuettel выше неверно относительно x/0. `x/0` не бесконечность --- ни в алгебре, ни в исчислении, ни в программировании. Рассмотрим x =1. Правый и левый пределы как y->0 из x/y не согласуются. Левый предел равен -inf, а правый предел равен inf. Это не тот предел. - person RudePeopleStepOff; 08.05.2015
comment
Упс. Спасибо за исправление. is.finite() и друзья по-прежнему поступают правильно. - person Dirk Eddelbuettel; 08.05.2015

Будут ли эти свойства полезными? 0*Inf равно NaN, а NaN+Inf также равно NaN, поэтому попытка сделать что-то подобное также даст желаемый результат:

quotient <- (num / denom)*0 + (num / denom)
## [1] -0.5 -2.0  NaN  4.0  2.5   NA
person Valentin    schedule 07.02.2018