Je suis familier avec tracemem()
montrant l'adresse mémoire hexagonale d'une variable assignée, par ex.
x <- 2
tracemem(x)
#> [1] "<0x876df68>"
mais qu'est-ce que cela implique (sous le capot) lorsque la valeur est littéralement juste une valeur non assignée ? par exemple
tracemem(4)
#> [1] "<0x9bd93b8>"
La même question s'applique à l'évaluation d'une expression sans affectation.
4
#> [1] 4
Il semble que si j'évalue ceci plusieurs fois dans la console, j'obtiens des adresses hexadécimales de plus en plus grandes.
tracemem(4)
#> [1] "<0x8779968>"
tracemem(4)
#> [1] "<0x87799c8>"
tracemem(4)
#> [1] "<0x8779a28>"
mais si je boucle explicitement cette opération
for ( i in 1:3 ) { print(tracemem(4)) }
#> [1] "<0x28bda48>"
#> [1] "<0x28bda48>"
#> [1] "<0x28bda48>"
ou avec sapply
via replicate
replicate(3, tracemem(4))
#> [1] "<0xba88208>" "<0xba88208>" "<0xba88208>"
J'obtiens des répétitions de la même adresse, même si je retarde explicitement l'impression entre les itérations.
for ( i in 1:3 ) { print(tracemem(4)); Sys.sleep(1) }
#> [1] "<0xa3c4058>"
#> [1] "<0xa3c4058>"
#> [1] "<0xa3c4058>"
Mon hypothèse la plus probable est que l'appel fait référence à une valeur déjà temporairement affectée dans le fichier parent.frame
donné eval.parent(substitute(
sur replicate
mais je n'en sais pas assez sur le système sous-jacent. .Primitive
code de for
pour savoir si ça fait la même chose là-bas.
J'ai confiance dans le fait que R
est de créer des variables temporaires étant donné que je peux faire
list(x = 1)
#> $x
#> [1] 1
donc R
doit traiter les données même s'il n'affecte jamais rien. Je suis conscient de la stricte formalité résumée par le tweet de @hadleywickham :
mais je ne suis pas sûr de savoir comment cela fonctionne ici. Est-ce que le nom temporaire n'est pas préservé ? Est-ce que le for
boucle utilise toujours ce nom/objet ? L'évaluation d'un grand nombre de codes, qu'ils soient assignés ou non, consomme-t-elle toujours de la mémoire ? (jusqu'à gc()
est appelé, quel que soit le moment où il est appelé)
tl;dr -- comment R
"stocker" les valeurs non attribuées pour l'impression ?