R Language
Classes numériques et modes de stockage
Recherche…
Numérique
Numeric représente des nombres entiers et doubles et est le mode par défaut attribué aux vecteurs de nombres. La fonction is.numeric()
évaluera si un vecteur est numérique. Il est important de noter que bien que les entiers et les doubles passeront is.numeric()
, la fonction as.numeric()
tentera toujours de convertir en double.
x <- 12.3
y <- 12L
#confirm types
typeof(x)
[1] "double"
typeof(y)
[1] "integer"
# confirm both numeric
is.numeric(x)
[1] TRUE
is.numeric(y)
[1] TRUE
# logical to numeric
as.numeric(TRUE)
[1] 1
# While TRUE == 1, it is a double and not an integer
is.integer(as.numeric(TRUE))
[1] FALSE
Les doublons sont la valeur numérique par défaut de R. Ce sont des vecteurs à double précision, ce qui signifie qu'ils occupent 8 octets de mémoire pour chaque valeur du vecteur. R n'a pas de type de données précis et tous les nombres réels sont donc stockés dans le format double précision.
is.double(1)
TRUE
is.double(1.0)
TRUE
is.double(1L)
FALSE
Les entiers sont des nombres entiers qui peuvent être écrits sans composant fractionnaire. Les entiers sont représentés par un nombre avec un L après lui. Tout nombre sans L après ce sera considéré comme un double.
typeof(1)
[1] "double"
class(1)
[1] "numeric"
typeof(1L)
[1] "integer"
class(1L)
[1] "integer"
Bien que, dans la plupart des cas, l'utilisation d'un nombre entier ou double ne compte pas, remplacer parfois les doubles par des nombres entiers consommera moins de mémoire et de temps de fonctionnement. Un double vecteur utilise 8 octets par élément tandis qu'un vecteur entier utilise seulement 4 octets par élément. À mesure que la taille des vecteurs augmente, l'utilisation de types appropriés peut accélérer considérablement les processus.
# test speed on lots of arithmetic
microbenchmark(
for( i in 1:100000){
2L * i
10L + i
},
for( i in 1:100000){
2.0 * i
10.0 + i
}
)
Unit: milliseconds
expr min lq mean median uq max neval
for (i in 1:1e+05) { 2L * i 10L + i } 40.74775 42.34747 50.70543 42.99120 65.46864 94.11804 100
for (i in 1:1e+05) { 2 * i 10 + i } 41.07807 42.38358 53.52588 44.26364 65.84971 83.00456 100