Martin Morgan
2011-Dec-08 22:52 UTC
[Rd] Reference class finalize() fails with 'attempt to apply non-function'
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 -- Computational Biology Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109 Location: M1-B861 Telephone: 206 667-2793
Dan Tenenbaum
2011-Dec-29 19:35 UTC
[Rd] Reference class finalize() fails with 'attempt to apply non-function'
On Thu, Dec 8, 2011 at 2:52 PM, Martin Morgan <mtmorgan at fhcrc.org> wrote:> 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 packagesHere 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> -- > Computational Biology > Fred Hutchinson Cancer Research Center > 1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109 > > Location: M1-B861 > Telephone: 206 667-2793 > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Reasonably Related Threads
- Class generator functions for reference classes
- Question about copying reference objects using the initialize method
- Is there a way to update a method on an existing Reference Class object?
- Reference classes and memory consumption
- Bug or feature: using "ANY" as a generic field class (was: '[R] Is there a (virtual) class that all R objects inherit from?)