“1L”和“1”有什么区别?

我经常看到符号 1L(或者 2L3L等等)出现在 R 代码中。1L1有什么不同?1==1L评估为 TRUE。为什么在 R 代码中使用 1L

94732 次浏览

来自 语言定义常数组:

我们可以使用‘ L’后缀来限定任何数字,目的是使它成为一个显式的整数。 因此,‘0x10L’从十六进制表示创建整数值16 将1000作为整数而不是数值给出,并且等效于1000L ‘ L’被视为符合术语1e3,而不是3。)如果我们用“ L”限定一个值,那就是 不是一个整数值,例如1e-3L,我们会收到一个警告,然后创建一个数值 如果数字中有一个不必要的小数点,例如1.L。

L 指定一个整数类型,而不是标准数值类的双精度类型。

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

所以,@詹姆斯和@布莱恩解释了 什么3L 的意思。但是 为什么你会用吗?

大多数情况下,它没有什么区别-但有时您可以使用它来获得您的代码到 跑快点和使用 更少的记忆。Double (“ numeric”)向量每个元素使用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(并为最小值取消该值)。

为了显式地为常量创建一个整数值,您可以调用函数 as.whole,或者更简单地使用“ L”后缀。