Question

J'aimerais comprendre la logique de R utilise lors du passage d'arguments aux fonctions, la création de copies de variables, etc.à l'égard de l'utilisation de la mémoire.Quand est-il réellement de créer une copie de la variable vsjuste en passant une référence à cette variable?En particulier, les situations, je suis curieux de savoir sont:

f <- function(x) {x+1}
a <- 1
f(a)

Est a être transmis littéralement ou est une référence à un être transmis?

x <- 1
y <- x

Référence de la copie?Quand est-ce pas le cas?

Si quelqu'un pourrait-il m'expliquer cela je vous en remercie vivement.

Était-ce utile?

La solution

Lorsqu'il transmet des variables, c'est toujours par copier plutôt que par référence.Parfois, cependant, vous n'obtiendrez pas une copie faite jusqu'à ce qu'une affectation qui se produit réellement.Le réel de la description du processus est de passer par la promesse.Jetez un oeil à la documentation

?force
?delayedAssign

Une conséquence pratique est qu'il est très difficile, voire impossible, pour éviter d'avoir besoin d'au moins deux fois plus de RAM que vos objets théoriquement occuper.La modification d'un objet de grande taille auront généralement besoin de faire une copie temporaire.

mise à jour:2015:J'font (et ont fait) d'accord avec Matt Dowle que ses données.tableau paquet fournit un itinéraire alternatif à l'affectation qui permet d'éviter le copier-problème de dédoublement.Si c'était la mise à jour demandée, alors je n'ai pas compris à l'époque de la suggestion a été faite.

Il y avait un changement récent dans la R 3.2.1 dans les règles d'évaluation pour apply et Reduce.Il a DONC annoncé, avec référence à la News ici: De retour des fonctions anonymes de lapply - ce qui ne va pas?

Et la intéressant document cité par jhetzel dans les commentaires est maintenant ici:

Autres conseils

Réponse tardive mais un aspect très important de la conception de langage qui n'est pas obtenir assez de la couverture sur le web (ou au moins les sources habituelles).

x <- c(0,4,2)
lobstr::obj_addr(x)
# [1] "0x7ff25e82b0f8"
y <- x
lobstr::obj_addr(y)
# [1] "0x7ff25e82b0f8"

Avis de l'identique "adresse mémoire", c'est à direl'emplacement de mémoire où l'objet est stocké.Vous pouvez donc confirmer que x et y pointent vers le même identificateur.

Hadley Wickham est à la pointe de la R livre tactile sur ceci:

Considérer ce code:

x <- c(1, 2, 3)

Il est facile à lire:“créer un objet nommé "x", contenant les valeurs 1, 2 et 3”.Malheureusement, c'est un la simplification qui va conduire à des prédictions inexactes au sujet de ce R la réalité derrière les coulisses.Il est plus exact de dire que ce code est en train de faire deux choses:

C'est la création d'un objet, d'un vecteur de valeurs, c(1, 2, 3).Et c'est la liaison de l'objet à un nom, x.En d'autres termes, l'objet, ou valeur, n'ont pas de nom;c'est en fait le nom qui a une valeur.

Notez qu'ils sont les adresses mémoire sont éphémères et changent à chaque nouveau R de la session.

Maintenant, voici la partie importante.

Dans la R de la sémantique, les objets sont copiés par valeur.Cela signifie que la modification de l' la copie des feuilles de l'objet d'origine intact.Depuis la copie de données dans la mémoire est une opération coûteuse, des copies dans R sont aussi paresseux que possible.Elles ne se produisent quand l'objet est réellement modifiée.Source:[R lang documentation][1]

Donc, si nous avons maintenant modifier la valeur de y en ajoutant une valeur du vecteur, y maintenant les points à un autre "objet".Ceci est en accord avec ce que dit la documentation concernant une opération de copie en cours "uniquement lorsque l'objet est modifié" (paresseux). y pointe vers une adresse différente de celle qu'elle était auparavant.

y <- c(y, -3)
print(lobstr::obj_addr(y))
# [1] "0x7ff25e825b48"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top