在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("数字","整数")?
答案 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.int
,seq_len
和seq_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
我选择inherits
或typeof
。第一个返回一个逻辑,它可以在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