在R中,为什么is.integer(1)返回FALSE?

时间:2014-11-04 21:57:42

标签: r types integer numeric type-conversion

在R中,is.integer(1)返回FALSE,class(1)返回"数字"而is.integer(1:1)返回TRUE,class(1:1)返回"整数"。为什么is.integer(1)不返回TRUE?

将打印值与class()或typeof()的输出进行比较会产生反直觉的结果。 E.g。

x1=seq(from=1, to=5, by=1) 
x2=1:5
x1 
[1] 1 2 3 4 5 
x2 
[1] 1 2 3 4 5 
class(x1) 
[1] "numeric" 
class(x2)
[1] "integer"

要确定x1是否包含整数值,我需要使用all(as.integer(x1)==x1)。有更简单的方法吗?

class()可以返回数组,例如有序因素。不应该class(1)返回c("数字","整数")?

1 个答案:

答案 0 :(得分:3)

希望这有助于澄清一些事情。你的例子不一定 说实话。实际上,从seq返回的向量类型取决于 您使用哪些参数。以下是对示例设置的介绍 ?seq

seqList <- list(
    fromto = seq(from = 1, to = 5),
    fromtoby = seq(from = 1, to = 5, by = 1),
    fromtolengthout = seq(from = 1, to = 5, length.out = 5),
    alongwith = seq(along.with = 5),
    from = seq(from = 1),
    lengthout = seq(length.out = 5),
    binary = 1:5
)

结果,我们可以看到当我们使用by参数时(就像你一样), 结果不是整数类型。一旦参数检查发生,结果的类型就会更改为数字(我想,如果我错了,请纠正我)。

str(seqList)
# List of 7
#  $ fromto         : int [1:5] 1 2 3 4 5
#  $ fromtoby       : num [1:5] 1 2 3 4 5
#  $ fromtolengthout: num [1:5] 1 2 3 4 5
#  $ alongwith      : int 1
#  $ from           : int 1
#  $ lengthout      : int [1:5] 1 2 3 4 5
#  $ binary         : int [1:5] 1 2 3 4 5

seq是一个泛型函数,它根据提供的参数调度到不同的方法。这一切都在?seq中解释过。值得一读。还有seq.intseq_lenseq_along也与seq不同。现在参考你的问题

  

要确定x1是否包含整数值,我需要使用all(as.integer(x1)==x1)。有更简单的方法吗?

该检查可能会导致一些问题,因为因素也是整数

f <- factor(letters[1:5])
x <- 1:5
f == x
# [1] FALSE FALSE FALSE FALSE FALSE
as.integer(f) == x
# [1] TRUE TRUE TRUE TRUE TRUE

我选择inheritstypeof。第一个返回一个逻辑,它可以在if语句中很好地工作。 typeof返回矢量类型的字符串。

look <- function(x) {
    c(class = class(x), typeof = typeof(x), 
      mode = mode(x), inherits = inherits(x, "integer"))
}
noquote(do.call(rbind, lapply(seqList, look)))
#                 class   typeof  mode    inherits
# fromto          integer integer numeric TRUE    
# fromtoby        numeric double  numeric FALSE   
# fromtolengthout numeric double  numeric FALSE   
# alongwith       integer integer numeric TRUE    
# from            integer integer numeric TRUE    
# lengthout       integer integer numeric TRUE    
# binary          integer integer numeric TRUE    

阅读帮助文件非常有用。我绝对不是这方面的专家,所以如果我在这里弄错了,请告诉我。这里有更多东西可以刺激好奇心:

is.integer(1)
# [1] FALSE
is.integer(1L)
# [1] TRUE