gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:49:09 28 4
gpt4 key购买 nike

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

将打印值与 class() 或 typeof() 的输出进行比较会导致反直觉的结果。例如

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("numeric", "integer") 吗?

最佳答案

希望这有助于澄清一些事情。你的例子不一定说出全部真相。事实上,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 是一个通用函数,它根据提供的参数分派(dispatch)到不同的方法。这一切都在 ?seq 中进行了解释。值得一读。还有seq.intseq_lenseq_along,它们也和seq不同。现在引用你的问题

To determine if x1 contains integer values I need to use all(as.integer(x1)==x1). Is there an easier way?

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

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

关于r - 在 R 中,为什么 is.integer(1) 返回 FALSE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26745810/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com