Подтвердить что ты не робот

Когда нужно указывать целые числа?

Я часто пишу R-код, где я проверяю длину вектора, количество строк в кадре данных или размеры матрицы, например if (length(myVector) == 1). В то время как выкалывание в каком-то базовом R-коде, я заметил, что в таких сравнениях значения явно указаны как целые числа, обычно используя суффикс "L", например if (nrow(data.frame) == 5L). Явные целые числа также иногда используются для аргументов функции, например, эти выражения из функции cor: x <- matrix(x, ncol = 1L) и apply(u, 2L, rank, na.last = "keep"). Когда целые числа должны быть явно указаны в R? Есть ли потенциально негативные последствия из-за отсутствия целых чисел?

4b9b3361

Ответ 1

Использование 1L и т.д. является программно безопасным, так как в нем указано, что имеется в виду, и не полагается на какие-либо преобразования и т.д.

При написании кода в интерактивном режиме легко заметить ошибки и исправить по пути, однако, если вы пишете пакет (даже base R), будет более безопасным быть явным.

Когда вы рассматриваете равенство, использование чисел с плавающей запятой вызовет проблемы с точностью См. часто задаваемые вопросы.

Явное указание целых чисел позволяет избежать этого, как nrow и length, а аргументы индекса apply возвращают или требуют целые числа.

Ответ 2

Вы спросили:

Есть ли потенциально негативные последствия, не указывая целые числа?

Бывают ситуации, когда это, скорее всего, будет иметь большее значение. Из программного обеспечения Chambers для анализа данных p193:

Целочисленные значения будут отображаться в точности как "двойные" числа так долго поскольку абсолютное значение целого числа меньше 2 ^ м, длина дробная часть представления (2 ^ 54 для 32-битных машин).

Нетрудно видеть, как если бы вы вычислили значение, оно могло бы выглядеть как целое, но не совсем одно:

> (seq(-.45,.45,.15)*100)[3]
[1] -15
> (seq(-.45,.45,.15)*100)[3] == -15L
[1] FALSE

Однако сложнее придумать пример явной типизации целого числа и иметь в нем не совсем целое число в представлении с плавающей точкой, пока вы не входите в более крупные значения, описанные Chambers.