有没有办法使用R6对象删除它';谁有自己的方法?
以下面给出的基本R6类为例:有没有办法使用R6对象删除它';谁有自己的方法?,r,oop,r6,R,Oop,R6,以下面给出的基本R6类为例: library(R6) Demo = R6Class("Demo", public = list( initialize = function(){ message("demo object initialized!") }, delete = function(){
library(R6)
Demo = R6Class("Demo",
public = list(
initialize = function(){
message("demo object initialized!")
},
delete = function(){
#should contain the logic to delete the object
gc()
},
finalize = function(){
message("demo object deleted!")
}
))
demoObj = Demo$new()
demoObj$delete()
delete函数内部的逻辑应该是什么?是否可以删除对象(self)?我不知道有什么简单的方法可以让R中的对象以这种方式“自毁”。对象属于创建它的环境,有充分的理由将对象生命周期的控制权留给创建它的环境,而不是对象本身 这并不意味着没有办法做到这一点,但实际上,您必须允许对象在其父帧中查找自己的名称(使用一个仅在删除过程启动后才识别它的标志),然后在父帧中对该名称调用
rm
。像这样的reprex:
库(R6)
Demo=R6Class(“Demo”,
公共=列表(
初始化=函数(){
消息(“演示对象已初始化!”)
},
delete_flag=FALSE,
delete=函数(){
self$delete_标志[1]“演示”
这是为了确保只删除正确的对象,例如:
demoObj1=Demo$new()
#>演示对象已初始化!
demoObj2=Demo$new()
#>演示对象已初始化!
demoObj3=Demo$new()
#>演示对象已初始化!
demoObj2$delete()
#>删除演示对象!
ls()
#>[1]“演示”“演示对象J1”“演示对象J3”
您可以看到,只有demoObj2
删除了自身
由(v0.3.0)于2020-08-08创建的我不熟悉r,但熟悉其他OO语言(如Java、Ruby),gc在不再引用该对象时完成。换句话说,该对象不会删除自身。一旦不再使用它,它将被垃圾收集。谢谢,我理解gc的用法,但想知道是否有任何方法可以使用类似rm(obj)的东西删除对象本身。将delete_标志设置为私有是否有意义,因为它仅用于内部使用?@AkshitAchara是的,尽管您需要一个getter函数才能读取它。谢谢,此方法将从父环境中删除该对象。是否有方法查找该对象的所有引用并将其删除,即如果另一个R6对象包含t我们希望删除的对象,那么该对象也应该从那里删除。(如果
demos@Akshit no,没有简单的方法可以做到这一点,原因很简单,一个对象没有任何关于它的点和名称的信息。就像我说的,依赖对象自己的delete
方法来试图摆脱它是一个很大的挑战。请相信我:不管你在尝试什么要做到这一点,有一个更好的方法。考虑一个不同的设计,如果你陷入困境,这里有很多人可以提供帮助。