【问题标题】:When should integers be explicitly specified?什么时候应该明确指定整数?
【发布时间】:2012-11-26 03:38:23
【问题描述】:

我经常编写 R 代码来测试向量的长度、数据框中的行数或矩阵的维度,例如 if (length(myVector) == 1)。在浏览一些基本的 R 代码时,我注意到在此类比较中,值被明确表示为整数,通常使用“L”后缀,例如if (nrow(data.frame) == 5L)。显式整数有时也用于函数参数,例如来自cor 函数的这些语句:x <- matrix(x, ncol = 1L)apply(u, 2L, rank, na.last = "keep")。什么时候应该在 R 中明确指定整数?不指定整数是否有任何潜在的负面影响?

【问题讨论】:

  • stackoverflow.com/q/7014387/602276 非常相似,尤其是接受的答案,它很好地回答了您的问题。
  • @Andrie- 感谢您指出这个问题和答案——不知道为什么它没有出现在我最初的搜索中。

标签: r integer


【解决方案1】:

你问:

不指定是否有任何潜在的负面影响 整数?

在某些情况下,它可能更重要。来自 Chambers 数据分析软件 p193:

整数值将完全表示为“双”数字这么长 由于整数的绝对值小于 2^m,所以长度为 表示的小数部分(32 位机器为 2^54)。

不难看出,如果您计算一个值,它可能看起来像一个整数,但并不完全是一个:

> (seq(-.45,.45,.15)*100)[3]
[1] -15
> (seq(-.45,.45,.15)*100)[3] == -15L
[1] FALSE

但是,很难想出一个显式输入整数并让它在浮点表示中不完全是整数的例子,直到你得到钱伯斯描述的更大的值。

【讨论】:

  • 不知道他为什么会说“对于 32 位机器”,考虑到他写的是 64 位双精度。
  • 不要在 32 位机器上使用 64 位(例如两个 32 位内存位置)?
  • 确实如此。它们在 64 位机器上也需要 64 位。
【解决方案2】:

使用1L 等在编程上是安全的,因为它明确了含义,并且不依赖任何转换等。

以交互方式编写代码时,很容易发现错误并在此过程中进行修复,但是如果您正在编写一个包(甚至是基础R),那么显式会更安全。

当您考虑相等时,使用浮点数会导致精度问题See this FAQ

显式指定整数可以避免这种情况,因为nrowlength 以及apply 的索引参数返回或需要整数。

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 2011-03-14
    • 2020-12-22
    • 2013-11-16
    • 2014-01-20
    • 2013-10-09
    • 2014-08-25
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多