Sfârșitul (unui obiect R6)
La fel cum o clasă R6 poate defini o metodă publică initialize() pentru a rula cod personalizat la crearea obiectelor, aceasta poate defini și o metodă publică finalize() pentru a rula cod personalizat la distrugerea obiectelor. finalize() nu ar trebui să primească argumente. Este folosită în mod obișnuit pentru a închide conexiuni la baze de date sau fișiere, ori pentru a anula efecte secundare, cum ar fi modificarea parametrilor globali options() (docs) sau a parametrilor grafici par() (docs).
Șablonul de cod ar trebui să arate astfel.
thing_factory <- R6Class(
"Thing",
public = list(
initialize = function(x, y, z) {
# do something
},
finalize = function() {
# undo something
}
)
)
Metoda finalize() este apelată atunci când obiectul este eliminat din memorie de colectorul automat de gunoi al R. Poți forța o colectare a gunoiului tastând gc() (docs).
Acest exercițiu face parte din cursul
Programare orientată pe obiecte cu S3 și R6 în R
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
# Microwave_factory is predefined
microwave_oven_factory
# Complete the class definition
smart_microwave_oven_factory <- R6Class(
"SmartMicrowaveOven",
inherit = ___, # Specify inheritance
private = list(
# Add a field to store connection
___ = ___
),
public = list(
initialize = function() {
# Connect to the database
___$___ = ___(___(), "___")
},
get_cooking_time = function(food) {
dbGetQuery(
private$conn,
sprintf("SELECT time_seconds FROM cooking_times WHERE food = '%s'", food)
)
},
finalize = function() {
# Print a message
___("___")
# Disconnect from the database
___(___$___)
}
)
)
# Create a smart microwave object
a_smart_microwave <- ___
# Call the get_cooking_time() method
___