2017-05-01 3 views
1

diesem kurzen Beispiel Siehe:Wie ändert man eine Liste von R6class-Objekten durch Referenz?

library(R6) 
library(pryr) 

Person <- R6Class("Person", public = list(name = NA, hair = NA, initialize = function(name, 
    hair) { 
    if (!missing(name)) self$name <- name 
    if (!missing(hair)) self$hair <- hair 
}, set_hair = function(val) { 
    self$hair <- val 
})) 
ann <- Person$new("Ann", "black") 
address(ann) 
#> [1] "0x27e01f0" 

ann$name <- "NewName" 
address(ann) 
#> [1] "0x27e01f0" 


ann2 <- Person$new("Ann", "white") 

g <- c(ann, ann2) 
address(g) 
#> [1] "0x32cc2d0" 

g[[1]]$hair <- "red" 
address(g) 
#> [1] "0x34459b8" 

I g[[1]]$hair <- "red" den Betrieb erwartete g wie ann$name <- "NewName" durch Verweis wird sich ändern. Gibt es einen Weg, dies zu erreichen?

Antwort

1

g ist nur ein Vektor, also hat es keine Referenzsemantik. Trotzdem erhalten Sie ein neues Objekt g, es bezieht sich auf die gleichen Objekte ann und ann2. Sie cam von address(g[[1]])

überprüfen, ob Sie wollen g nicht ändern, müssen Sie das Objekt aus g extrahieren und dann die Zuordnung Methode aufrufen.

address(g) 
##[1] "0000000019782340" 

# Extract the object and assign 
temp <- g[[1]] 
temp$hair <- "New red" 

address(g) 
[1] "0000000019782340" 
#Verify the value on g 
g[[1]]$hair 
##[1] "New red" 

address(g) 
#[1] "0000000019782340" 
+0

Also wenn ich 'g' ändere, wird die Änderung auch auf 'ann' stattfinden. Bedeutet das, dass "g" den Bezug auf "ann" und "ann2" speichert, nicht das ganze Objekt? – mt1022

+0

Ja, da das Objekt Person Referenzsemantik verwendet. – Marcelo

Verwandte Themen