[Rd] Problems with definitions of S4-generics
J ö rg Beyer
Beyerj at students.uni-marburg.de
Wed Jan 31 16:02:21 CET 2007
Hello all,
I'd like to report a problem related to S4 classes.
Platform:
Mac G4/400 PCI (PPC-architecture)
Mac OS 10.4.8
R 2.4.1 for Mac OS X (CRAN binary, 2006-12-19) w/ R.app 1.18
Last December, Simon Urbanek confirmed that the issue is not platform
related, and that it is most likely a bug. He suggested to post my report
to "the appropriate mailing list" -- I choose r-devel.
#### Problem-intro:
## Define two S4-classes
setGeneric("foofunc", def=function(object) {standardGeneric("foofunc")})
setGeneric("barfunc", def=function(object) {standardGeneric("barfunc")})
#### Okay, let's start.
#### Fist the correct part
## Do some tests to see if the generic is present,
## and have a look at some details
isGeneric("foofunc")
# [1] TRUE
findFunction("foofunc")
# [[1]]
# <environment: R_GlobalEnv>
foofunc
# nonstandardGenericFunction for "foofunc" defined from package ".GlobalEnv"
#
# function (object)
# {
# standardGeneric("foofunc")
# }
# <environment: 0x293bbb8>
# Methods may be defined for arguments: object
getGeneric("foofunc")
# same result as above
#### Now what I suspect is a bug
## Delete the S4-generic and repeat the "forensic" test calls
removeGeneric("foofunc")
# [1] TRUE
## The following is as expected...
foofunc
# Fehler: objekt "foofunc" nicht gefunden [~ Error: object "foofunc" not
found]
## Oops, but what's that?
getGeneric("foofunc")
# nonstandardGenericFunction for "foofunc" defined from package ".GlobalEnv"
#
# function (object)
# {
# standardGeneric("foofunc")
# }
# <environment: 0x19be228>
# Methods may be defined for arguments: object
## Why not try to remove it a second time?
removeGeneric("foofunc")
# [1] FALSE
# Warning message:
# generic function "foofunc" not found for removal in:
removeGeneric("foofunc")
## Another test to see if there is a function definition somewhere
## Weird ...
isGeneric("foofunc")
# [1] TRUE
## Okay, let's see, where it is
## Ah, registered, but nowhere ...
findFunction("foofunc")
# list()
## Just to be sure, test this other generic
## (which we know *is present*)
## Okay, as expected...
findFunction("barfunc")
# [[1]]
# <environment: R_GlobalEnv>
## End of demo
There are situations where this behavior has negative consequences.
Thanks for your interest.
Cheers
Jörg
More information about the R-devel
mailing list