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
也许答案可以在GitHub的typeconvert
的C源代码中找到?
不幸的是我不熟悉C。
答案 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