Skip to content

Reference class finalize() fails with 'attempt to apply non-function'

2 messages · Martin Morgan, Dan Tenenbaum

#
This bug appears intermittently in R CMD check when reference classes 
have finalize methods. The problem is that garbage collection can be run 
after the methods package is no longer available. It affects 
(periodically) the Bioconductor AnnotationDbi package as well as 
packages that contain Rcpp classes. To reproduce:

   library(methods)
   a = setRefClass("A", methods=list(finalize=function() cat("A\n")))
   b = setRefClass("B", contains="A")

repeat b = setRefClass("B", contains="A") until finalize does not run 
(no garbage collection triggered during setRefClass)

   b = setRefClass("B", contains="A")
   b = setRefClass("B", contains="A")

and then

 > detach("package:methods")
 > gc()
Error in function (x)  : attempt to apply non-function
Error in function (x)  : attempt to apply non-function

 > traceback()
1: function (x)
    x$.self$finalize()(<environment>)

I believe a variant of the same type of problem generates an error

Error in function (x)  : no function to return from, jumping to top level

also seen in AnnotationDbi and Rcpp packages
20 days later
#
On Thu, Dec 8, 2011 at 2:52 PM, Martin Morgan <mtmorgan at fhcrc.org> wrote:
Here is a self-contained reproducible example that immediately and
consistently produces the error on R 2.14 and R-devel:

library(methods)
a = setRefClass("A",
  methods=list(finalize=function() options("finalized"=TRUE)))
b = setRefClass("B", contains="A")

while (TRUE) {
    options("finalized" = FALSE)
    b = setRefClass("B", contains="A")
    if (!getOption("finalized")) break
}

detach("package:methods")
gc()



Thanks!
Dan