R引用类中是否有析构函数?

R引用类中是否有析构函数?,r,reference-class,R,Reference Class,作为测试: myclass = setRefClass("myclass", fields = list( x = "numeric", y = "numeric" )) myclass$methods( dfunc = function(i) { message("In

作为测试:

myclass = setRefClass("myclass",
                       fields = list(
                           x = "numeric",
                           y = "numeric"
                       ))


myclass$methods(
    dfunc = function(i) {
        message("In dfunc, I save x and y...")
        obj = .self
        base::save(obj, file="/tmp/obj.rda")
    }
    )

myclass$methods(
    print = function() {
            if (.self$x > 10) {
                stop("x is too large!")
            }
    message(paste("x: ", .self$x))
    message(paste("y: ", .self$y))
    }
    )

myclass$methods(
    initialize = function(x=NULL, y=NULL, obj=NULL) {
        if(is.null(obj)) {
            .self$x = x
            .self$y = y
        }
        else {
            .self$x = obj$x
            .self$y = obj$y
        }
    }
)


myclass$methods(
finalize = function() {
    message("I am finalizing this thing...")
}
)
然后尝试创建并删除一个对象:

u = myclass(15, 6)
u$print()
rm(u)

finalize函数根本不被调用…

当您调用
rm
时,您只需从环境中删除对象引用,但不会破坏元素。
这是垃圾收集器的工作,它设计用于在对象没有更多引用时自动销毁对象(如本例中)。无论如何,垃圾收集器是由一些特殊事件触发的(例如,内存使用过多等),因此在调用
rm
时不会自动调用垃圾收集器(稍后可能会调用它)

无论如何,您可以通过调用
gc()
强制垃圾收集器,即使这通常是不鼓励的


正如您通过运行上述代码所看到的,finalize方法确实是在
gc()之后调用的。

谢谢。另一件有趣的事情是,如果我将x设置为myclass$lock(“x”)只读,那么为x设置新值的尝试也会调用finalize(),这是为什么?@qed:有趣的是,你能举个例子说明锁定x后如何设置x吗?哦,对不起,不能再重复了,一定是个意外,我想,当我试着这样做时,GC碰巧在工作。@qed:我明白了,但我仍然对在将“x”设置为只读后如何设置它感兴趣。。。它应该会引起一个错误…是的,它确实引起了一个错误。我只是做了一些类似于obj$x=222的事情。
u = myclass(15, 6)
rm(u)
gc()

# > I am finalizing this thing...