在R中使用整数值而不是数值(例如1L和1)的好处 [英] Benefits of using integer values for constants rather than numeric values (e.g. 1L vs 1) in R

查看:0
本文介绍了在R中使用整数值而不是数值(例如1L和1)的好处的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在R源代码中,大多数(但不是所有)函数对常量使用整数值:

colnames <- function(x, do.NULL = TRUE, prefix = "col")
{
    if(is.data.frame(x) && do.NULL)
    return(names(x))
    dn <- dimnames(x)
    if(!is.null(dn[[2L]]))
    dn[[2L]]
    else {
        nc <- NCOL(x)
    if(do.NULL) NULL
        else if(nc > 0L) paste0(prefix, seq_len(nc))
        else character()
    }
}

R Language Definition表示:

在大多数情况下,整数和数值之间的差异并不重要,因为R在使用数字时会做正确的事情。但是,有时我们希望显式地为常量创建整数值。

  • 在哪些情况下需要强制为常量设置整数值,而不是简单地使用数值?欢迎使用例如%1将失败但例如%1L将不会失败的示例。
  • 相反,在哪些情况下不需要使用整数值(例如,交互使用与编程、使用常量索引等)?

问题是关于良好实践和基本原理,而不是关于the "L" notation itselfthe difference between integer class and numeric classcomparing numbers

推荐答案

这些是我在声明常量时显式使用L后缀的一些用例。当然,这些并不是严格意义上的规范(或者说唯一的),但或许你可以对背后的道理有所了解。我为每种情况添加了必需的标志,您将看到只有在与其他语言(如C)接口时才会出现这些情况。

  • 逻辑类型转换(不需要)

而不是使用经典的as.integer,我使用将0L与逻辑向量相加使其成为整数。当然,您可以只使用0,但这将需要更多的内存(通常是8个字节,而不是4个字节)和一个转换。

  • 处理返回整数的函数的结果(不需要)
例如,假设您想要在NA之后查找以检索向量的元素。您可以:

which(is.na(vec)) + 1L

由于which返回integer,因此添加1L将保留类型并避免隐式转换。如果省略L,什么都不会发生,因为这只是一个小的优化。例如,match也会发生这种情况:如果您希望对此类函数的结果进行后处理,最好尽可能保留该类型。

  • 接口C(必需)

发件人?integer

存在整数向量,以便将数据传递到C或Fortran 需要它们的代码,因此(小)整型数据可以 准确而紧凑地表示。

C对数据类型的要求要严格得多。这意味着,如果将向量传递给C函数,则不能依赖C来执行转换。假设您想用某个值替换NA后面的元素,比如42。您在R级别找到NA值的位置(就像我们之前对which所做的那样),然后将原始向量和索引向量传递给C。C函数将如下所示:

SEXP replaceAfterNA (SEXP X, SEXP IND) {
   ...
   int *ind = INTEGER(IND);
   ...
   for (i=0; i<l; i++) {
        //make here the replacement
   }
}

和来自右侧的:

...
ind <- which(is.na(x)) + 1L
.Call("replaceAfterNA", x, ind)
...

如果省略上面第一行中的L,您将收到如下错误:

INTEGER() cannot be applied to double vectors

因为C需要整数类型。

  • 连接Java(必需)

和以前一样。如果您使用rJava包并希望R调用您自己的定制Java类和方法,则必须确保当Java方法需要一个整数时传递一个整数。这里没有添加特定的示例,但在这些情况下,您可能希望在常量中使用L后缀,这一点应该很清楚。

附录

前面提到的情况下,您可能需要使用L。即使我猜不太常见,添加一个您不希望L的案例也是有用的。如果存在整数溢出的危险,则可能会出现这种情况。如果两个操作数都是整数,则*+-运算符保留类型。例如:

#this overflows
31381938L*3231L
#[1] NA
#Warning message:
#In 31381938L * 3231L : NAs produced by integer overflow

#this not
31381938L*3231
#[1] 1.01395e+11

因此,如果您对可能产生溢出的整数变量执行操作,重要的是将其强制转换为double以避免任何风险。向该变量添加/减去不带L的常量可能是进行强制转换的好时机。

这篇关于在R中使用整数值而不是数值(例如1L和1)的好处的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆