Dit is het einde (van een R6-object)
Net zoals een R6-klasse een publieke initialize()-methode kan definiëren om aangepaste code uit te voeren wanneer objecten worden gemaakt, kan ze ook een publieke finalize()-methode definiëren om aangepaste code uit te voeren wanneer objecten worden vernietigd. finalize() mag geen argumenten hebben. Deze methode wordt meestal gebruikt om verbindingen met databases of bestanden te sluiten, of om bijwerkingen ongedaan te maken, zoals het wijzigen van globale options() (docs) of grafische par()-parameters (docs).
De sjabloon voor de code ziet er als volgt uit.
thing_factory <- R6Class(
"Thing",
public = list(
initialize = function(x, y, z) {
# do something
},
finalize = function() {
# undo something
}
)
)
De finalize()-methode wordt aangeroepen wanneer het object uit het geheugen wordt verwijderd door R's automatische garbage collector. Je kunt een garbage collection afdwingen door gc() te typen (docs).
Deze oefening maakt deel uit van de cursus
Objectgeoriënteerd programmeren met S3 en R6 in R
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
# 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
___