为什么R会使用" L"后缀表示整数?

时间:2014-06-22 11:21:32

标签: r parsing integer semantics

在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 

我希望两者都返回错误。

2 个答案:

答案 0 :(得分:30)

为什么" L"用作后缀?

我从来没有看到它写下来,但我理所当然地说明了两个原因:

  1. 因为R处理可以使用。指定的复数 后缀"i",这与"I"

  2. 太相似了
  3. 因为R的整数是32位长整数而且" L"因此,参考这种数据类型似乎是明智的简写。

  4. 长整数可以取的值取决于字大小。 R本身不支持字长为64位的整数。 R中的整数具有32位的字长并且是有符号的,因此具有−2,147,483,6482,147,483,647的范围。较大的值存储为double

    This wiki page提供了有关常见数据类型及其常规名称和范围的更多信息。

    也来自?integer

      

    注意,R的当前实现使用32位整数作为整数向量,因此可表示整数的范围被限制为大约+/- 2 * 10 ^ 9:双精度可以精确地保持更大的整数。


    为什么1.0L和1.1L会返回不同的类型?

    1.0L1.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)

用于:为常量显式创建一个整数值

方法1

a <- as.interger(1)

方法2

a <- 1L
str(a)   # int 1

如果未明确将中间值分配给

a <- 1
str(a)   # num 1