`1L`和`1`有什么区别?

我经常看到符号1L (或2L3L等)出现在R代码中。 1L1什么区别? 1==1L计算结果为TRUE 。 为什么在R代码中使用1L

所以,@詹姆斯和@布赖恩解释 3L的含义。 但是,你为什么要使用它?

大多数时候它没有什么区别 – 但有时你可以使用它来让你的代码运行得更快,并消耗更less的内存 。 双(“数字”)向量使用每个元素8个字节。 整数向量每个元素只使用4个字节。 对于大型向量来说,内存浪费的less,而且CPU也less(因此速度通常更快)。

大多数情况下,这适用于处理索引。 下面是一个将整数向量加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 (并且否定最小值)。

从R语言的常量部分 定义 :

我们可以使用'L'后缀来限定任何数字,目的是使其成为一个明确的整数。 所以'0x10L'从hex表示中创build整数值16。 常量1e3L给出1000作为一个整数而不是数值,相当于1000L。 (请注意,'L'被视为限定术语1e3而不是3)。如果我们使用不是整数值(例如1e-3L)的“L”限定值,则会发出警告,数值为创build。 如果数字中有不必要的小数点,例如1.L,也会产生警告。

L指定一个整数types,而不是标准数字类的double。

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