我经常编写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中明确指定整数?不指定整数会产生任何潜在的负面后果吗?
答案 0 :(得分:6)
你问:
未指定是否会产生任何潜在的负面影响 整数?
在某些情况下,它可能更重要。来自钱伯斯数据分析软件 p193:
整数值将完全表示为“双”数字 由于整数的绝对值小于2 ^ m,所以长度为 表示的小数部分(32位机器为2 ^ 54)。
不难看出如果你计算一个它可能看起来像一个整数但又不是一个整数的值:
> (seq(-.45,.45,.15)*100)[3]
[1] -15
> (seq(-.45,.45,.15)*100)[3] == -15L
[1] FALSE
然而,更难以提出一个显式输入整数并在浮点表示中出现不是一个整数的例子,直到你得到钱伯斯所描述的更大的值。
答案 1 :(得分:2)
使用1L
等在程序上是安全的,因为它明确指出是什么意思,并且不依赖于任何转换等。
以交互方式编写代码时,很容易发现错误并在此过程中进行修复,但是如果您正在编写程序包(甚至是基础R
),那么显式更安全。
当您考虑相等时,使用浮点数会导致精度问题See this FAQ。
显式指定整数避免了这种情况,如nrow
和length
,以及apply
的索引参数返回或需要整数。