Skip to content
Back to formatted view

Raw Message

Message-ID: <CAF42j21JfMNa_6yhE9nM3UzK8gY2G-Q2xhehPvyTPVjLEWTPWQ@mail.gmail.com>
Date: 2011-12-29T19:35:25Z
From: Dan Tenenbaum
Subject: Reference class finalize() fails with 'attempt to apply non-function'
In-Reply-To: <4EE13FC6.5070606@fhcrc.org>

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 packages

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




> --
> 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