Questo è la fine (di un oggetto R6)
Così come una classe R6 può definire un metodo pubblico initialize() per eseguire codice personalizzato quando gli oggetti vengono creati, può anche definire un metodo pubblico finalize() per eseguire codice personalizzato quando gli oggetti vengono distrutti. finalize() non deve accettare argomenti. In genere si usa per chiudere connessioni a database o a file, o per annullare effetti collaterali come modifiche alle options() globali (docs) o ai parametri grafici par() (docs).
Il modello di codice è il seguente.
thing_factory <- R6Class(
"Thing",
public = list(
initialize = function(x, y, z) {
# do something
},
finalize = function() {
# undo something
}
)
)
Il metodo finalize() viene chiamato quando l'oggetto viene rimosso dalla memoria dal garbage collector automatico di R. Puoi forzare una garbage collection digitando gc() (docs).
Questo esercizio fa parte del corso
Programmazione orientata agli oggetti con S3 e R6 in R
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
# 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
___