Итак, @James и @Brian объяснили, что означает 3L. Но почему вы его используете?
В большинстве случаев это не имеет значения, но иногда вы можете использовать его для ускорения работы вашего кода и потреблять меньше памяти . Двойной («числовой») вектор использует 8 байтов на элемент. Целочисленный вектор использует только 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
всякий раз, когда вам нужно максимальное целочисленное значение (и отрицать это для минимума).