В чем разница между целочисленным классом и числовым классом в R


Я хочу предварить это, сказав, что я абсолютный новичок в программировании, поэтому, пожалуйста, извините, насколько прост этот вопрос.

Я пытаюсь лучше понять" атомарные " классы в R и, возможно, это относится к классам программирования в целом. Я понимаю разницу между символьными, логическими и сложными классами данных, но я изо всех сил пытаюсь найти фундаментальное различие между числовым классом и целочисленным классом.

допустим, у меня есть простой вектор x <- c(4, 5, 6, 6) целых чисел, это имело бы смысл для этого, чтобы быть целым классом. Но когда я это делаю class(x) Я [1] "numeric". Тогда, если я преобразую этот вектор в целочисленный класс x <- as.integer(x). Он возвращает тот же самый точный список чисел, за исключением того, что класс отличается.

мой вопрос заключается в том, почему это так, и почему класс по умолчанию для набора целых чисел является числовым классом, и каковы преимущества и недостатки того, что целое число установлено как числовое вместо целого.

2 59

2 ответа:

есть несколько классов, которые сгруппированы вместе как "числовые" классы, 2 наиболее распространенных из которых являются double (для чисел с плавающей запятой двойной точности) и integer. R будет автоматически преобразовываться между числовыми классами, когда это необходимо, поэтому для случайного пользователя по большей части не имеет значения, хранится ли число 3 в настоящее время как целое число или как двойное. Большая часть математики выполняется с использованием двойной точности, так что это часто хранилище по умолчанию.

иногда может потребоваться специально хранить вектор как целые числа, если вы знаете, что они никогда не будут преобразованы в двойники (используемые в качестве значений идентификаторов или индексирования), поскольку целые числа требуют меньше места для хранения. Но если они будут использоваться в любой математике, которая преобразует их в double, то, вероятно, будет быстрее всего хранить их как Double для начала.

во-первых, вполне возможно использовать R успешно в течение многих лет и не нужно знать ответ на этот вопрос. R обрабатывает различия между (обычными) числами и целыми числами для вас в фоновом режиме.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(ввод заглавной буквы ' L ' после целого числа заставляет его храниться как целое число.)

как вы можете видеть, " integer "является подмножеством"numeric".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

целые числа идут только немного больше, чем 2 миллиарда, в то время как другие цифры может быть намного больше. Они могут быть больше, потому что они хранятся в виде чисел с плавающей запятой двойной точности. Это означает, что число хранится в двух частях: экспоненте (например, 308 выше, за исключением базы 2, а не базы 10) и "значащем" (например, 1.797693 выше).

обратите внимание, что 'это.integer ' - это не проверка того, есть ли у вас целое число, а проверка того, как хранятся данные.

одна вещь, чтобы следить за тем, что оператор двоеточия,:, вернется целые числа, если начальная и конечная точки являются целыми числами. Например, 1:5 создает integer вектор чисел от 1 до 5. Вам не нужно добавлять букву L.

> class(1:5)
[1] "integer"

ссылка: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R