在R中,我们都知道,我们希望确保处理整数以使用"L"
后缀来指定它,这样会很方便:
1L
# [1] 1
如果我们没有明确告诉R我们想要一个整数,它会假设我们打算使用numeric
数据类型......
str( 1 * 1 )
# num 1
str( 1L * 1L )
# int 1
为什么“L”是首选后缀,为什么不是“我”呢?有历史原因吗?
此外,为什么R允许我这样做(有警告):
str(1.0L)
# int 1
# Warning message:
# integer literal 1.0L contains unnecessary decimal point
但不是..
str(1.1L)
# num 1.1
#Warning message:
#integer literal 1.1L contains decimal; using numeric value
我希望两者都返回错误。
答案 0 :(得分:30)
我从来没有看到它写下来,但我理所当然地说明了两个原因:
因为R处理可以使用。指定的复数
后缀"i"
,这与"I"
因为R的整数是32位长整数而且" L"因此,参考这种数据类型似乎是明智的简写。
长整数可以取的值取决于字大小。 R本身不支持字长为64位的整数。 R中的整数具有32位的字长并且是有符号的,因此具有−2,147,483,648
到2,147,483,647
的范围。较大的值存储为double
。
This wiki page提供了有关常见数据类型及其常规名称和范围的更多信息。
也来自?integer
注意,R的当前实现使用32位整数作为整数向量,因此可表示整数的范围被限制为大约+/- 2 * 10 ^ 9:双精度可以精确地保持更大的整数。
1.0L
和1.1L
将返回不同数据类型的原因是因为为1.1
返回一个整数会导致信息丢失,而对于1.0
则不会(但您可能想知道您不再有浮点数字)。深入了解词法分析器(/src/main/gram.c:4463-4485
)的是此代码(函数NumericValue()
的一部分),它实际上从int
输入创建double
数据类型,后缀为ascii "L"
:
/* Make certain that things are okay. */
if(c == 'L') {
double a = R_atof(yytext);
int b = (int) a;
/* We are asked to create an integer via the L, so we check that the
double and int values are the same. If not, this is a problem and we
will not lose information and so use the numeric value.
*/
if(a != (double) b) {
if(GenerateCode) {
if(seendot == 1 && seenexp == 0)
warning(_("integer literal %s contains decimal; using numeric value"), yytext);
else {
/* hide the L for the warning message */
*(yyp-2) = '\0';
warning(_("non-integer value %s qualified with L; using numeric value"), yytext);
*(yyp-2) = (char)c;
}
}
asNumeric = 1;
seenexp = 1;
}
}
答案 1 :(得分:0)
a <- as.interger(1)
a <- 1L
str(a) # int 1
a <- 1
str(a) # num 1