Je veux commencer en disant que je suis un débutant absolu en programmation, alors veuillez excuser à quel point cette question est fondamentale.
J'essaie d'avoir une meilleure compréhension des 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 données caractère, 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 le fais, class(x)
je reçois [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 pourquoi est-ce le cas, et pourquoi la classe par défaut pour un ensemble d'entiers est une classe numérique, et quels sont les avantages et / ou les inconvénients d'avoir un entier défini comme numérique au lieu d'entier.
as.integer(c(4.1, 5.2, 6.3, 6.4))
vous aide- t- il à comprendre la différence? Vous devez comprendre que la représentation interne et ce qui est imprimé ne sont pas du tout les mêmes. Quoi qu'il en soit, lisez un peu sur les types de données dans les langages informatiques.x <- 1; is.integer(x); is.numeric(x)
doncx <- 1L; is.integer(x); is.numeric(x)
et vous pourrez peut-être voir un peu la différence. Les classes entières sont davantage utilisées pour transmettre des variables à partir de constructions C et également dans les structures R. Cependant, il y a beaucoup plus à cela.Réponses:
Il existe plusieurs classes qui sont regroupées sous forme de classes "numériques", dont les 2 plus courantes sont les doubles (pour les nombres à virgule flottante double précision) et les entiers. R convertira automatiquement entre les classes numériques en cas de besoin, donc dans la plupart des cas, peu importe pour l'utilisateur occasionnel si le nombre 3 est actuellement stocké sous forme d'entier ou de double. La plupart des calculs sont effectués en 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 comme valeurs d'identification ou d'indexation) car les entiers nécessitent moins d'espace de stockage. Mais s'ils doivent être utilisés dans des mathématiques qui les convertissent en double, alors il sera probablement plus rapide de les stocker simplement en tant que doubles pour commencer.
la source
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 entiers pour vous en arrière-plan.
(Mettre un 'L' majuscule après un entier oblige à le stocker sous forme d'entier.)
Comme vous pouvez le voir, "integer" est un sous-ensemble de "numeric".
Les nombres entiers ne dépassent qu'un peu plus de 2 milliards, tandis que les autres nombres peuvent être beaucoup plus grands. Ils peuvent être plus gros car ils sont stockés sous forme de nombres flottants à 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 "significand" (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 façon dont 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 uninteger
vecteur de nombres de 1 à 5. Vous n'avez pas besoin d'ajouter la lettreL
.Référence: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R
la source
Pour citer la page d'aide (essayez
?integer
), partie en gras de la mienne:Comme le dit la page d'aide, les R
integer
sont des nombres signés de 32 bits et peuvent donc contenir entre -2147483648 et +2147483647 et occuper 4 octets.R
numeric
est identique à un 64 bitsdouble
conforme à la norme IEEE 754. R n'a pas de type de données de précision unique. (source: pages d'aide denumeric
etdouble
). Un double peut stocker tous les nombres entiers compris entre -2 ^ 53 et 2 ^ 53 exactement sans perdre en précision.Nous pouvons voir les tailles des types de données, y compris la surcharge d'un vecteur ( source ):
la source
À ma connaissance, nous ne déclarons pas de variable avec un type de données, donc par défaut, R a défini un nombre sans L comme un numérique. Si vous avez écrit:
Exemple d'entier:
Exemple de Numeric (un peu comme double / float d'autres langages de programmation)
la source
1:5
va créer des entiers.