Quelle est la différence entre la classe entière et la classe numérique dans R

Je veux commencer par dire que je suis un débutant en programmation absolue, alors excusez-moi à quel point cette question est fondamentale.

J’essaie de mieux comprendre les classes “atomiques” de R et peut-être cela vaut-il pour les cours de programmation en général. Je comprends la différence entre une classe de caractères, logique et complexe, mais j’ai du mal à trouver la différence fondamentale entre une classe numérique et une classe entière.

Disons que j’ai un simple vecteur x <- c(4, 5, 6, 6) d’entiers, il serait logique que ce soit une classe entière. Mais quand je class(x) j’obtiens [1] "numeric" . Ensuite, si je convertis ce vecteur en une classe entière x <- as.integer(x) . Il renvoie la même liste exacte de nombres sauf que la classe est différente.

Ma question est la suivante: pourquoi la classe par défaut d’un ensemble d’entiers est-elle une classe numérique, et quels sont les avantages et les inconvénients d’un nombre entier défini sur un nombre plutôt que sur un entier.

Il existe plusieurs classes regroupées sous forme de classes “numériques”, les deux plus courantes étant les doubles (pour les nombres à virgule flottante double précision) et les nombres entiers. R convertira automatiquement entre les classes numériques si nécessaire, donc pour la plupart des utilisateurs, le nombre 3 est actuellement stocké sous la forme d’un entier ou d’un double. La plupart des calculs sont effectués en double précision, ce qui en fait souvent le stockage par défaut.

Parfois, vous souhaiterez peut-être stocker spécifiquement un vecteur sous forme d’entiers si vous savez qu’ils ne seront jamais convertis en doubles (utilisés comme valeurs d’ID ou indexation), car les entiers nécessitent moins d’espace de stockage. Mais si elles sont utilisées dans des calculs qui les convertissent en doublons, il sera probablement plus rapide de les stocker en tant que doubles pour commencer.

Tout d’abord, il est parfaitement possible d’utiliser R pendant des années sans avoir besoin de connaître la réponse à cette question. R gère les différences entre les nombres et les entiers (habituels) pour vous en arrière-plan.

 > is.numeric(1) [1] TRUE > is.integer(1) [1] FALSE > is.numeric(1L) [1] TRUE > is.integer(1L) [1] TRUE 

(La mise en majuscule ‘L’ après un entier oblige à la stocker en tant qu’entier.)

Comme vous pouvez le voir, “integer” est un sous-ensemble de “numeric”.

 > .Machine$integer.max [1] 2147483647 > .Machine$double.xmax [1] 1.797693e+308 

Les nombres entiers ne dépassent qu’un peu plus de 2 milliards, tandis que les autres nombres peuvent être beaucoup plus importants. Ils peuvent être plus gros car ils sont stockés sous forme de nombres à virgule flottante double précision. Cela signifie que le nombre est stocké en deux parties: l’exposant (comme 308 ci-dessus, sauf dans la base 2 plutôt que la base 10), et le “significande” (comme 1.797693 ci-dessus).

Notez que “is.integer” n’est pas un test pour savoir si vous avez un nombre entier, mais un test de la manière dont les données sont stockées.

Une chose à surveiller est que l’opérateur deux-points, : , retournera des nombres entiers si les points de début et de fin sont des nombres entiers. Par exemple, 1:5 crée un vecteur integer de nombres compris entre 1 et 5. Il n’est pas nécessaire d’append la lettre L

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

Référence: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R-