Я часто видел символ 1L
(или 2L
, 3L
и т.д.) в R-коде. В чем разница между 1L
и 1
? 1==1L
соответствует TRUE
. Почему 1L
используется в R-коде?
Какая разница между `1L` и` 1`?
Ответ 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.