Я часто пишу 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? Есть ли потенциально негативные последствия из-за отсутствия целых чисел?
Когда нужно указывать целые числа?
Ответ 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.