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)
好吧,这并不像看起来那么奇怪.让我们来看看源代码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)
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |