Клонування об'єктів R6

Об'єктно-орієнтоване програмування з S3 та R6 в R

Richie Cotton

Data Evangelist at DataCamp

 

 

  • Середовища копіюються за посиланням
  • Так само і об'єкти R6
Об'єктно-орієнтоване програмування з S3 та R6 в R

 

thing_factory <- R6Class(
  "Thing",

private = list( ..a_field = 123 ),
active = list( a_field = function(value) { if(missing(value)) { private$..a_field } else { private$..a_field <- value } } )
)
Об'єктно-орієнтоване програмування з S3 та R6 в R

 

a_thing <- thing_factory$new()
a_copy <- a_thing

a_thing$a_field <- 456
a_copy$a_field
456
Об'єктно-орієнтоване програмування з S3 та R6 в R

 

 

 

clone() копіює за значенням

Об'єктно-орієнтоване програмування з S3 та R6 в R

 

a_clone <- a_thing$clone()
a_thing$a_field <- 789
a_clone$a_field
456
Об'єктно-орієнтоване програмування з S3 та R6 в R

 

container_factory <- R6Class(
  "Container",

private = list( ..thing = thing_factory$new() ),
active = list( thing = function(value) { if(missing(value)) { private$..thing } else { private$..thing <- value } } )
)
Об'єктно-орієнтоване програмування з S3 та R6 в R

 

a_container <- container_factory$new()
a_clone <- a_container$clone()
a_container$thing$a_field <- "a new value" 
a_clone$thing$a_field
"a new value"
Об'єктно-орієнтоване програмування з S3 та R6 в R

 

a_deep_clone <- a_container$clone(deep = TRUE)
a_container$thing$a_field <- "a different value" 
a_deep_clone$thing$a_field
"a new value"
Об'єктно-орієнтоване програмування з S3 та R6 в R

Підсумок

  • Об'єкти R6 копіюються за посиланням
  • Копіюйте їх за значенням за допомогою clone()
  • clone() створюється автоматично
  • clone(deep = TRUE) — для полів R6
Об'єктно-орієнтоване програмування з S3 та R6 в R

Давайте потренуємось!

Об'єктно-орієнтоване програмування з S3 та R6 в R

Preparing Video For Download...