问题描述
我看到关于 R 的整数类型的一个常见评论是它仅真正用于与 C 代码通信。 R 文档的任何官方部分中是否出现过这样的声明?我经常发现自己制作像 integer(10)
这样的向量,因为它们对我的目的更有效,只是为了记住这个民间传说并重新考虑我是否应该将整数用于从不尝试与 C 代码通信的代码.
解决方法
我不这么认为。这个民间传说可能来自这样一个事实,即 R 在类型和强制方面非常松散,因此很容易意外地得到一个浮点变量。
整数类型当然可以节省内存:
> object.size(seq(1e8))
400000048 bytes
> object.size(seq(1e8)+0.1)
800000048 bytes
我还没有尝试过基准测试,看看 R 是否使用更快的例程进行整数与浮点运算,但您可以。
我没有仔细浏览所有的 R 文档,但在 R language definition 中对“整数”的全文搜索中出现的唯一稍微相关的评论是:
在大多数情况下,整数和数值之间的区别并不重要,因为 R 在使用数字时会做正确的事情。但是,有时我们希望为常量显式创建整数值。我们可以通过调用函数 as.integer
或使用各种其他技术来做到这一点......
我在 R 源代码树的 grep integer *.texi
目录中执行了 doc/manual
并且没有(快速浏览)注意到任何其他看起来相关的内容。
按照 Ben Bolker's 的建议,我检查了 seven R manuals。除了 Ben's answer,我还发现了以下内容:
在大多数情况下,用户不会关心数字向量中的“数字”是整数、实数还是复数。如果输入数据为复数,则内部计算以双精度实数或双精度复数的形式进行。
An Introduction to R Section 2.2
Writing R Extensions 为使 R 与 C 和 Fortran 通信提供了很多指导,但它没有说明整数类型的意图。
最后要检查的地方是 Full Reference Manual。你将不得不是疯成这样 - “整数”发生在1000次的话。但是,快速查看索引会发现 the documentation for the integer class。这给了我们答案是如此简单的英语,我不应该错过它:
存在整数向量,以便数据可以传递给需要它们的 C 或 Fortran 代码,并且(小)整数数据可以精确且紧凑地表示。