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

时间:2011-08-10 16:30:46

标签: r types

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

4 个答案:

答案 0 :(得分:109)

所以,@ 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 :(得分:51)

来自Constants SectionR Language Definition

  

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

答案 2 :(得分:43)

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

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

答案 3 :(得分:1)

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