Я использовал is.finite()
для векторов, матриц и т. Д., И это хорошо работает.Что меня озадачивает, так это то, почему он возвращает FALSE
для фреймов данных и списков.
Например, следующий пример:
m <- matrix(0, 3, 3)
d <- as.data.frame(m)
is.finite(m)
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
is.finite(d)
V1 V2 V3
FALSE FALSE FALSE
Естественно, он имеет то же самоеповедение для списков.
Я могу понять, если функция не работает для определенного типа объекта (например, фреймы данных).За исключением тривиального случая («остановленные часы правы два раза в день» -> матрица с неконечными значениями), я не вижу случая, когда is.finite()
должен возвращать что-либо значимое для фрейма данных или списка,Я ожидал бы ошибку вместо FALSE
, иначе ожидал бы, что она принудит вводить, скажем, матрицу, перед применением функции.
Вопрос: есть ли какой-то способ осмысленно использовать is.finite()
с фреймами данных (и списками), или есть что-то в его поведении, для которого имеет смысл возвращать FALSE
, чемошибка?
Примечание 1: Кстати, это есть в документации:
All elements of types other than logical, integer, numeric and complex vectors
are false. Complex numbers are finite if both the real and imaginary parts are.
Итак, проясним вопрос: зачем возвращать false, а не ошибку?В результате необходимо добавить проверку типа вне вызова к is.finite()
.
Примечание 2. Просто для рассмотрения случая использования: я рассматривал возможность использования is.na()
, is.nan()
и is.infinite()
для проверки некоторых числовых аномалий и решил, что is.finite()
справится, пока я не понял, что он не ведет себя так же, как для кадров данных, как is.na()
.Это несоответствие было неожиданным.
Обновление (2011-11-01): R 2.14.0 был выпущен и его файл NEWS сообщает: The default methods for is.finite(), is.infinite() and is.nan() now signal an error if their argument is not an atomic vector.
Спасибо, боги R-Core!(NB: Kohske ранее сообщал, что это будет иметь место, как указано в версии для разработки. Новость заключается в том, что теперь именно это - это сейчас версия выпуска.)