为什么type.convert不能将存储为数字的大型“整数”转换为整数?

时间:2018-12-05 16:18:29

标签: r

class(type.convert(as.numeric(1e3)))
# [1] "integer"
class(type.convert(as.numeric(1e4)))
# [1] "integer"
class(type.convert(as.numeric(1e5)))
# [1] "numeric"
class(type.convert(as.numeric(1e6)))
# [1] "numeric"

为什么较大的不转换为整数?还有很多事情要去:

.Machine$integer.max
# [1] 2147483647

也许答案可以在GitHubtypeconvert的C源代码中找到? 不幸的是我不熟悉C。

1 个答案:

答案 0 :(得分:5)

好吧,这并不像看起来那么奇怪。让我们看一下utils:::type.convert.default的源代码:

function (x, na.strings = "NA", as.is = FALSE, dec = ".", numerals = c("allow.loss", 
    "warn.loss", "no.loss"), ...) 
{
    if (is.array(x)) 
        storage.mode(x) <- "character"
    else x <- as.character(x)
    .External2(C_typeconvert, x, na.strings, as.is, dec, match.arg(numerals))
}

重要的部分是x <- as.character(x):无论输入是什么,在尝试转换其类型之前,它都会被强制转换为字符(这很奇怪,因为numeric或{{1} }向量可能会原样返回,我认为无需进一步处理)。如何完成此操作,取决于integer的性质和值。例如:

x

当尝试使用#numeric value as.character(100000) #[1] "1e+05" #integer value as.character(100000L) #[1] "100000" 时,type.convert是合适的整数字符串,而"100000"不是合适的字符串,这解释了不同的行为。考虑到"1e+05"也取决于as.character选项。如果将scipen设置得足够高,则不会产生科学计数法,但是会产生as.character认为是整数的数字。

type.convert