Почему type.convert не преобразует большие "целые числа", которые хранятся как числа, в целые числа? - PullRequest
0 голосов
/ 05 декабря 2018
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

Может быть, ответ можно найти в источнике C typeconvert на GitHub ?К сожалению, я совершенно незнаком с C.

1 Ответ

0 голосов
/ 05 декабря 2018

Хорошо, это менее странно, чем кажется.Давайте посмотрим на исходный код 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...