web-dev-qa-db-fra.com

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

Je voudrais commencer par dire que je suis un débutant en programmation absolue, alors veuillez nous excuser, en quoi cette question est fondamentale. 

J'essaie de mieux comprendre les classes "atomiques" dans R, et peut-être que cela vaut pour les classes de programmation en général. Je comprends la différence entre une classe de caractères, logique et complexe, mais je peine à 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) of integers, il serait logique que cela soit une classe d'entiers. Mais quand je fais class(x) je reçois [1] "numeric". Ensuite, si je convertis ce vecteur en un entier de classe x <- as.integer(x). Il retourne la même liste exacte de nombres sauf que la classe est différente. 

Ma question est la suivante: pourquoi est-ce le cas et pourquoi la classe par défaut pour un ensemble d’entiers est-elle une classe numérique? Quels sont les avantages et les inconvénients d’avoir un entier défini comme numérique au lieu d’un entier? 

64
Keon

Plusieurs classes sont regroupées sous forme de classes "numériques", les 2 plus courantes étant double (pour les nombres à virgule flottante double précision) et entier. R convertira automatiquement les classes numériques en cas de besoin. Par conséquent, pour l’utilisateur occasionnel, peu importe si le nombre 3 est actuellement stocké sous forme d’entier ou de double. La plupart des calculs sont effectués à l'aide de la double précision, c'est donc 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 en tant que valeurs d’ID ou indexation) car les entiers nécessitent moins d’espace de stockage. Mais s'ils doivent être utilisés en mathématiques pour les convertir en doubles, il sera probablement plus rapide de les stocker sous forme de doubles pour commencer.

60
Greg Snow

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

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Mettre le capital 'L' après un entier force à le stocker en tant qu'entier.)

Comme vous pouvez le voir, "entier" est un sous-ensemble de "numérique".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

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

Notez que 'is.integer' ne permet pas de savoir si vous avez un nombre entier, mais bien de savoir comment les données sont stockées.

Une chose à surveiller est que l'opérateur deux-points, :, retournera des 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. Vous n'avez pas besoin d'ajouter 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

33

Si je comprends bien, nous ne déclarons pas une variable avec un type de données. Par conséquent, par défaut, R a défini un nombre sans L comme numérique . Si vous avez écrit:

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

Exemple de nombre entier: 

> x<- 2L
> print(x)

Exemple de Numeric (un peu comme le double/float d'autres langages de programmation)

> x<-3.4
> print(x)
0
Farah Nazifa

Pour citer la page d’aide (essayez ?integer), la partie en gras mienne:

Les vecteurs entiers existent afin que les données puissent être transmises au code C ou Fortran qui les attend, et afin que (petit) données entières puissent être représentées de manière exacte et compacte .

Notez que les implémentations actuelles de R utilisent des entiers 32 bits pour les vecteurs entiers, ainsi la plage d'entiers pouvant être représentés est limitée à environ +/- 2 * 10 ^ 9: les doubles peuvent contenir des entiers beaucoup plus grands exactement.

Comme le dit la page d'aide, les integername__s de R sont des nombres 32 bits signés. Ils peuvent donc contenir entre -2147483648 et +2147483647, et occuper 4 octets.

numericde R est identique à un doublede 64 bits conforme à la norme IEEE 754. R n'a pas de type de données simple précision. (source: pages d'aide de numericet doublename__). n double peut stocker tous les entiers compris entre -2 ^ 53 et 2 ^ 53 exactement sans perdre en précision.

Nous pouvons voir la taille des types de données, y compris la surcharge d’un vecteur ( source ):

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes
0
qwr