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

min*_*nem 7 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"
Run Code Online (Sandbox Code Playgroud)

为什么较大的那些没有转换为整数?还有很多事要做:

.Machine$integer.max
# [1] 2147483647
Run Code Online (Sandbox Code Playgroud)

也许答案可以typeconvertGitHub的C源代码中找到?不幸的是我对C很不熟悉.

nic*_*ola 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))
}
Run Code Online (Sandbox Code Playgroud)

重要的部分是x <- as.character(x):无论输入是什么,它都会在尝试转换其类型之前被强制转换为字符(这非常特殊,因为numeric或者integer矢量可能会按原样返回,我认为没有进一步处理).如何做到这一点,取决于它的性质和价值x.例如:

#numeric value
as.character(100000)
#[1] "1e+05"
#integer value
as.character(100000L)
#[1] "100000"
Run Code Online (Sandbox Code Playgroud)

当它尝试时type.convert,"100000"是一个合适的整数字符串,而"1e+05"不是,这解释了不同的行为.考虑到这as.character也取决于scipen选项.如果设置得足够高,as.character则不会产生科学记数法,而是可以认为是整数的数字type.convert.

options(scipen=999)
options("scipen")
as.character(100000)
#[1] "100000"
Run Code Online (Sandbox Code Playgroud)