Comprendre exactement quand un ensemble de données.le tableau est une référence à (vs une copie) de l'autre des données.table

Je vais avoir un peu de mal à comprendre le passage par référence à des propriétés de data.table. Certaines opérations semblent à "casser" la référence, et j'aimerais comprendre exactement ce qui se passe.

Sur la création d'un data.table à partir d'un autre data.table (via <-, puis la mise à jour de la nouvelle table en :=, la table d'origine est également modifié. C'est prévu, comme par:

?data.table::copy
et stackoverflow: passage par référence-la-opérateur-dans-la-table de données-paquet

Voici un exemple:

library(data.table)

DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
#      a  b
# [1,] 1 11
# [2,] 2 12

newDT <- DT        # reference, not copy
newDT[1, a := 100] # modify new DT

print(DT)          # DT is modified too.
#        a  b
# [1,] 100 11
# [2,]   2 12

Cependant, si j'insère un non-:= en fonction de modification entre le <- de cession et de la := lignes ci-dessus, DT n'est plus désormais modifié:

DT = data.table(a=c(1,2), b=c(11,12))
newDT <- DT        
newDT$b[2] <- 200  # new operation
newDT[1, a := 100]

print(DT)
#      a  b
# [1,] 1 11
# [2,] 2 12

Il semble donc que la newDT$b[2] <- 200 ligne en quelque sorte des "pauses" de la référence. Je suppose que cela appelle une copie en quelque sorte, mais je voudrais comprendre pleinement comment R est le traitement de ces opérations, pour m'assurer de ne pas introduire des bugs dans mon code.

Je serais très heureux si quelqu'un pourrait-il m'expliquer cela.

Je viens de découvrir cette "fonctionnalité", et c'est horrible. Il est largement préconisée sur les Internets à utiliser <- au lieu de = pour l'affectation de base dans R (par exemple par Google: google.github.io/styleguide/Rguide.xml#affectation). Mais cela signifie que les données.manipulation de la table ne fonctionne pas de la même façon que le bloc de données de manipulation et est donc loin d'une baisse-dans le remplacement de bloc de données.

OriginalL'auteur Peter Fine | 2012-04-19