1L和1之间有什么区别?


152

我经常看到的符号1L(或2L3L等)出现中的R代码。1L和之间有什么区别11==1L评估为TRUE。为什么1L在R代码中使用?


18
注意:1 == 1L给出TRUE,但是identical(1, 1L)给出FALSE
CJB

2
另请参见R中的L澄清
Henrik'1

Answers:


129

因此,@ James和@Brian解释 3L的含义。但是为什么要使用它呢?

在大多数情况下,它没有什么区别-但是有时您可以使用它来使代码运行得更快,并占用更少的内存。双精度(“数字”)向量每个元素使用8个字节。整数向量每个元素仅使用4个字节。对于大向量,这将减少内存浪费,减少CPU占用的时间(因此通常更快)。

通常在处理索引时适用。这是一个将整数向量加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!

...并且正如@Gavin指出的那样,整数的范围大约为-2e9至2e9。

需要注意的是,这适用于当前的R版本(2.13)。R可能会在某个时候改变它(64位整数会很不错,这可能会启用长度大于2e9的向量)。为安全起见,应.Machine$integer.max在需要最大整数值(并取反最小值)时使用。


1
我认为R的内存要求与类型无关,至少根据object.size。有用的是传递到可能需要特定类型数据的Fortran或C代码。
詹姆斯,

2
不,尝试object.size(1:100)object.size(1:100+0)400字节+一些开销与800字节+一些开销进行比较。我更新了上面的示例。
汤米,

2
值得一提的是,整数溢出是由于使用的32位带符号整数,因此限制为约+/- 2 * 10 ^ 9,即使在64位R ...
加文辛普森

1
@Zach键入的时间也短很多:-)
Gavin Simpson

1
@Gavin Simpson当然。我真的想在那里你创建一个完整的载体,像这种情况c(1L, 2L, 3L, 4L,...100L)VS as.integer(c(1, 2, 3, 4,...100))
扎克(Zach)

54

R语言定义的“ 常量”部分中:

我们可以使用“ L”后缀来限定任何数字,以使其成为显式整数。因此,“ 0x10L”从十六进制表示形式创建整数值16。常数1e3L给出1000作为一个整数而不是一个数值,并且等效于1000L。(请注意,将“ L”视为限定术语1e3而不是3。)如果我们用非整数值的“ L”限定一个值,例如1e-3L,则会收到警告,并且数字值为创建。如果数字中不必要的小数点,例如1.L,也会创建警告。


46

L指定一个整数类型,而不是标准数字类的两倍。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.