我想说这是一个绝对的编程初学者,所以请原谅这个问题是多么基本。
我正在努力更好地理解R中的“原子”类,这可能适用于编程中的类。我理解字符,逻辑和复杂数据类之间的区别,但我很难找到数字类和整数类之间的根本区别。
假设我有一个简单的整数x <- c(4, 5, 6, 6)
向量,这对于整数类是有意义的。但是当我class(x)
时,我得到[1] "numeric"
。然后,如果我将此向量转换为整数类x <- as.integer(x)
。除了类不同之外,它返回相同的精确数字列表。
我的问题是为什么会出现这种情况,以及为什么一组整数的默认类是一个数字类,以及将整数设置为数字而不是整数的优点和缺点是什么。
答案 0 :(得分:64)
有多个类组合在一起作为“数字”类,其中最常见的两个是double(对于双精度浮点数)和整数。 R将在需要时自动在数字类之间进行转换,因此对于临时用户而言,数字3当前是以整数还是以双精度存储并不重要。大多数数学运算使用双精度,因此通常是默认存储。
有时您可能希望将矢量专门存储为整数,如果您知道它们永远不会转换为双精度(用作ID值或索引),因为整数需要较少的存储空间。但是如果它们将被用于任何将它们转换为双倍的数学中,那么将它们作为双打开始可能是最快的。
答案 1 :(得分:36)
首先,多年来成功使用R是完全可行的,不需要知道这个问题的答案。 R在后台处理(通常)数字和整数之间的差异。
> is.numeric(1)
[1] TRUE
> is.integer(1)
[1] FALSE
> is.numeric(1L)
[1] TRUE
> is.integer(1L)
[1] TRUE
(在整数后面加上大写'L'强制它存储为整数。)
如您所见,“整数”是“数字”的子集。
> .Machine$integer.max
[1] 2147483647
> .Machine$double.xmax
[1] 1.797693e+308
整数只有20多亿,而其他数字可能要大得多。它们可以更大,因为它们存储为双精度浮点数。这意味着数字存储在两个部分中:指数(如上面的308,除了基数2而不是基数10),以及“有效数字”(如上面的1.797693)。
请注意,'is.integer'不是测试您是否拥有整数,而是测试数据的存储方式。
需要注意的一点是,如果起点和终点是整数,冒号运算符:
将返回整数。例如,1:5
会创建一个从1到5的integer
数字向量。您无需附加字母L
。
> class(1:5)
[1] "integer"
参考:https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R
答案 2 :(得分:2)
要引用帮助页面(尝试?integer
),请使用粗体显示部分:
存在整数向量,以便可以将数据传递给期望它们的C或Fortran代码,从而可以(小)整数数据精确而紧凑地表示。
请注意,R的当前实现将32位整数用于整数矢量,因此可表示整数的范围被限制为大约+/- 2 * 10 ^ 9:双精度数可以精确地容纳更大的整数。
就像帮助页面上所说,R的integer
是带符号的32位数字,因此可以保存在-2147483648和+2147483647之间,并占用4个字节。
R的numeric
与符合IEEE 754标准的64位double
相同。 R没有单一精度数据类型。 (来源:numeric
和double
的帮助页面)。 A double can store all integers between -2^53 and 2^53 exactly without losing precision.
我们可以看到数据类型的大小,包括向量(source)的开销:
> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes
答案 3 :(得分:1)
据我所知-我们没有声明具有数据类型的变量,因此默认情况下R将没有L的任何数字设置为数字。 如果您写过:
> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct
整数示例:
> x<- 2L
> print(x)
数字示例(类似于其他编程语言中的double / float)
> x<-3.4
> print(x)