Хорошо, это менее странно, чем кажется.Давайте посмотрим на исходный код 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
или 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
.
options(scipen=999)
options("scipen")
as.character(100000)
#[1] "100000"