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

Zac*_*ach 142 types r

我经常看到的符号1L(或2L,3L等)出现中的R代码.什么区别1L11==1L评估为TRUE.为什么1L在R代码中使用?

Tom*_*mmy 122

所以,@ 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) 
Run Code Online (Sandbox Code Playgroud)

...但是请注意,过度使用整数可能很危险:

1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
Run Code Online (Sandbox Code Playgroud)

......正如@Gavin指出的那样,整数的范围大致为-2e9到2e9.

但需要注意的是,这适用于当前的R版本(2.13).R可能会在某些时候改变它(64位整数会很甜,这可能会使长度> 2e9的向量).为了安全起见,您应该.Machine$integer.max在需要最大整数值时使用(并在最小值时将其否定).

  • 不,尝试`object.size(1:100)`与`object.size(1:100 + 0)`它是400字节+一些开销与800字节+一些开销.我更新了上面的例子. (2认同)
  • 值得一提的是整数溢出是由于使用32位有符号整数,因此限制在大约+/- 2*10 ^ 9,即使在64位R ... (2认同)
  • @Gavin Simpson 当然。我真的在想你创建一个完整的向量的情况,比如 `c(1L, 2L, 3L, 4L,...100L)` vs `as.integer(c(1, 2, 3, 4,.. .100))`。 (2认同)

Bri*_*don 54

常量段中的R语言定义:

我们可以使用'L'后缀来限定任何数字,以使其成为显式整数.所以'0x10L'从十六进制表示创建整数值16.常量1e3L给出1000作为整数而不是数值,相当于1000L.(注意,'L'被视为限定术语1e3而不是3).如果我们用'L'限定一个不是整数值的值,例如1e-3L,我们得到一个警告,数值是创建.如果数字中存在不必要的小数点,也会创建警告,例如1.L.


Jam*_*mes 44

L指定整数类型,而不是标准数字类的double.

> str(1)
 num 1
> str(1L)
 int 1
Run Code Online (Sandbox Code Playgroud)