Какая разница между `1L` и` 1`?

Я часто видел символ 1L (или 2L, 3L и т.д.) в R-коде. В чем разница между 1L и 1? 1==1L соответствует TRUE. Почему 1L используется в R-коде?

Ответ 1

Итак, @James и @Brian объяснили , что означает 3L. Но почему вы его используете?

В большинстве случаев это не имеет значения, но иногда вы можете использовать его, чтобы заставить ваш код работать быстрее и потреблять меньше памяти. Двойной ( "числовой" ) вектор использует 8 байтов на элемент. Integer вектор использует только 4 байта на элемент. Для больших векторов эта менее затратная память и меньше, чтобы пробивать процессор (так это обычно быстрее).

В большинстве случаев это применяется при работе с индексами. Здесь пример, когда добавление 1 к целочисленному вектору превращает его в двойной вектор:

x <- 1:100
typeof(x) # integer

y <- x+1
typeof(y) # double, twice the memory size
object.size(y) # 840 bytes (on win64) 

z <- x+1L
typeof(z) # still integer
object.size(z) # 440 bytes (on win64) 

... но также отметим, что чрезмерная работа с целыми числами может быть опасной:

1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!

... и, как отметил Гавин, диапазон для целых чисел примерно от -2e9 до 2e9.

Следует заметить, что это относится к текущей версии R (2.13). R может изменить это в какой-то момент (64-битные целые числа будут милыми, что может позволить векторы длиной > 2e9). Чтобы быть в безопасности, вы должны использовать .Machine$integer.max всякий раз, когда вам нужно максимальное целочисленное значение (и отрицать это для минимума).

Ответ 2

Из раздела Константы Определение языка R

Мы можем использовать суффикс "L", чтобы квалифицировать любое число с целью сделать его явным целым числом. Итак, '0x10L создает целочисленное значение 16 из шестнадцатеричного представления. Постоянная 1e3L дает 1000 как целое число, а не числовое значение и эквивалентно 1000L. (Обратите внимание, что 'L рассматривается как квалифицирующий термин 1е3, а не 3.) Если мы квалифицируем значение с' L, которое а не целочисленное значение, например. 1e-3L, мы получаем предупреждение и создается числовое значение. Предупреждение также создается, если в номере есть ненужная десятичная точка, например. 1.L.

Ответ 3

L указывает целочисленный тип, а не двойной, чем стандартный числовой класс.

> str(1)
 num 1
> str(1L)
 int 1

Ответ 4

Чтобы явно создать целочисленное значение для константы, вы можете вызвать функцию as.integer или просто использовать суффикс L.