Re: [Rd] S3 generics without NS and cleanEx()

From: Torsten Hothorn <Torsten.Hothorn_at_rzmail.uni-erlangen.de>
Date: Wed 15 Feb 2006 - 09:38:42 GMT

On Wed, 15 Feb 2006, Prof Brian Ripley wrote:

> Torsten,
>
> The error is that .__S3MethodsTable__. ends up in the global environment.
> Are you importing sctest (I can't see it)? I think that's the problem.
>

yes. But `strucchange' has no namespace and so I can't import `sctest' in the NAMESPACE file. Or am I missing something?

Thanks!

Torsten

>> From R-exts:
>
> The standard method for S3-style @code{UseMethod} dispatching might fail
> to locate methods defined in a package that is imported but not attached
> to the search path. To ensure that these methods are available the
> packages defining the methods should ensure that the generics are
> imported and register the methods using @code{S3method} directives.
> ^^^^^^^^
>
> Brian
>
> On Wed, 15 Feb 2006, Torsten Hothorn wrote:
>
>>
>> Good morning,
>>
>> we recently observed a problem with importing S3 generics from a foreign
>> package (without namespace), defining a S3 method in a package _with_
>> namespace and the `cleanEx()' function which is automatically generated
>> and executed before examples are run by R CMD check.
>>
>> To be more precise. Package `strucchange' defines a S3 generic
>>
>> sctest <- function(x, ...) UseMethod("sctest")
>>
>> and the development version of `party' defines
>>
>> sctest.mob <- function(x, node = NULL, ...) {
>> ...
>>
>> which is exported in party's namespace
>>
>> S3method(sctest, mob)

>>
>> Creating a `mob' object and running `sctest' on it works fine.
>>
>> However, when we attach `party' and run `cleanEx()', the `sctest' method
>> for `mob' is no longer found. Before `cleanEx()' we get
>>
>> R> methods(sctest)
>> [1] sctest.Fstats sctest.efp sctest.formula sctest.gefp
>> sctest.mob*
>>
>> and afterwards
>>
>> R> methods(sctest)
>> [1] sctest.Fstats sctest.efp sctest.formula sctest.gefp
>>
>> is missing.
>>
>> Debugging `cleanEx()' shows that those objects are removed from the
>> global environment:
>>
>> ls(envir = env, all.names = TRUE)
>> [1] ".Random.seed" ".__S3MethodsTable__." "GCtorture"
>> [4] "a" "euro"
>>
>> where the second one looks very suspicious.
>>
>> `party_0.4-0.tar.gz' is available from
>>
>> http://www.imbe.med.uni-erlangen.de/~hothorn/party_0.4-0.tar.gz
>>
>> and
>>
>> http://www.imbe.med.uni-erlangen.de/~hothorn/modeltools_0.2-3.tar.gz
>>
>> is required.
>>
>> The example below can be reproduced with both R-2.2.1 and R-2.3.0.
>>
>> Best wishes,
>>
>> Torsten
>>
>>
>>
>> R> invisible(options(echo = TRUE))
>> R> ### * <HEADER>
>> R> ###
>> R> attach(NULL, name = "CheckExEnv")
>> R> assign(".CheckExEnv", as.environment(2), pos = length(search())) # base
>> R> ## add some hooks to label plot pages for base and grid graphics
>> R> setHook("plot.new", ".newplot.hook")
>> R> setHook("persp", ".newplot.hook")
>> R> setHook("grid.newpage", ".gridplot.hook")
>> R>
>> R> assign("cleanEx",
>> + function(env = .GlobalEnv) {
>> + rm(list = ls(envir = env, all.names = TRUE), envir = env)
>> + RNGkind("default", "default")
>> + set.seed(1)
>> + options(warn = 1)
>> + delayedAssign("T", stop("T used instead of TRUE"),
>> + assign.env = .CheckExEnv)
>> + delayedAssign("F", stop("F used instead of FALSE"),
>> + assign.env = .CheckExEnv)
>> + sch <- search()
>> + newitems <- sch[! sch %in% .oldSearch]
>> + for(item in rev(newitems))
>> + eval(substitute(detach(item), list(item=item)))
>> + missitems <- .oldSearch[! .oldSearch %in% sch]
>> + if(length(missitems))
>> + warning("items ", paste(missitems, collapse=", "),
>> + " have been removed from the search path")
>> + },
>> + env = .CheckExEnv)
>> R> assign("..nameEx", "__{must remake R-ex/*.R}__", env = .CheckExEnv) # for now
>> R> assign("ptime", proc.time(), env = .CheckExEnv)
>> R> grDevices::postscript("party-Ex.ps")
>> R> assign("par.postscript", graphics::par(no.readonly = TRUE), env = .CheckExEnv)
>> R> options(contrasts = c(unordered = "contr.treatment", ordered = "contr.poly"))
>> R> options(warn = 1)
>> R> library('party')
>> Loading required package: survival
>> Loading required package: splines
>> Loading required package: grid
>> Loading required package: modeltools
>> Loading required package: coin
>> Loading required package: mvtnorm
>> Loading required package: zoo
>> Loading required package: sandwich
>> Loading required package: strucchange
>> R>
>> R> methods(sctest)
>> [1] sctest.Fstats sctest.efp sctest.formula sctest.gefp sctest.mob*
>>
>> Non-visible functions are asterisked
>> R>
>> R> assign(".oldSearch", search(), env = .CheckExEnv)
>> R> assign(".oldNS", loadedNamespaces(), env = .CheckExEnv)
>> R> cleanEx(); ..nameEx <- "BinaryTree-class"
>> R>
>> R> methods(sctest)
>> [1] sctest.Fstats sctest.efp sctest.formula sctest.gefp
>> R>
>> R>
>> R> proc.time()
>> [1] 1.77 0.01 1.97 0.00 0.00
>> R>
>>
>> ______________________________________________
>> R-devel@r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>
>
> --
> Brian D. Ripley, ripley@stats.ox.ac.uk
> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
> University of Oxford, Tel: +44 1865 272861 (self)
> 1 South Parks Road, +44 1865 272866 (PA)
> Oxford OX1 3TG, UK Fax: +44 1865 272595
>
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed Feb 15 20:43:27 2006

This archive was generated by hypermail 2.1.8 : Thu 16 Feb 2006 - 06:35:43 GMT