[Rd] (PR#7320) Internal function isUME() in findGeneric() is wrong

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Oct 29 20:43:01 CEST 2004


On Fri, 29 Oct 2004, Jeffrey J. Hallman wrote:

> OK, I looked at the documentation and you're right about that.  However,
> I'm curious about why the first argument to UseMethod is ever necessary.
> Is there ever a good reason for it to be something other than the name
> of the calling function?  (Wouldn't that lead to confusing code?)  If
> not, why bother with it at all?

Yes. See coefficients(), fitted.values(). Also, you can have anonymous 
functions in R, operator functions ....

> 
> I've become spoiled by programming a lot recently in Smalltalk, which is
> the cleanest language I've used yet.
> 
> Jeff
> 
> 
> Prof Brian Ripley <ripley at stats.ox.ac.uk> wrote:
> 
>   br> The issue is the use of UseMethod(), which you claim to be valid.  As it
>   br> is inconsistent with the prime documentation, the help page, I would
>   br> question if it is `perfectly legal'.  I expect the author of isUME
>   br> implemented the behaviour described on the help page.
> 
>   br> It is documented in S-PLUS as *strongly discouraged*, and although it is
>   br> documented in R-lang, I believe the right thing to do is to make the code
>   br> agree with the prime documentation.
> 
>   br> I see no uses of UseMethod() in the R sources, and on CRAN only
>   br> one in a comment (and none in BioC).
> 
>   br> On Thu, 28 Oct 2004 jhallman at frb.gov wrote:
> 
>   >> Full_Name: Jeff Hallman
>   >> Version: 2.0
>   >> OS: Linux
>   >> Submission from: (NULL) (132.200.32.34)
>   >> 
>   >> 
>   >> The function findGeneric() in the utils namespace contains this internal
>   >> function:
>   >> 
>   >> isUME <- function(e) {
>   >> if (is.call(e) && (is.name(e[[1]]) || is.character(e[[1]]))) {
>   >> switch(as.character(e[[1]]), UseMethod = as.character(e[[2]]), 
>   >> "{" = isUMEbrace(e), "if" = isUMEif(e), "")
>   >> }
>   >> else ""
>   >> }
>   >> 
>   >> This fails if the generic called UseMethod() without an argument, which is
>   >> perfectly legal.  Changing it to this seems to work:
>   >> 
>   >> isUME <- function(e) {
>   >> if(is.call(e) &&(is.name(e[[1]]) || is.character(e[[1]]))) {
>   >> switch(as.character(e[[1]]), 
>   >> UseMethod = ifelse(length(e) == 1, fname, as.character(e[[2]])), 
>   >> "{" = isUMEbrace(e),
>   >> "if" = isUMEif(e),
>   >> "")
>   >> }
>   >> else ""
>   >> }
>   >> 
>   >> 
>   >> Jeff
>   >> 
>   >> ______________________________________________
>   >> R-devel at stat.math.ethz.ch mailing list
>   >> https://stat.ethz.ch/mailman/listinfo/r-devel
>   >> 
>   >> 
> 
>   br> -- 
>   br> Brian D. Ripley,                  ripley at stats.ox.ac.uk
>   br> Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
>   br> University of Oxford,             Tel:  +44 1865 272861 (self)
>   br> 1 South Parks Road,                     +44 1865 272866 (PA)
>   br> Oxford OX1 3TG, UK                Fax:  +44 1865 272595
> 
> 
> 

-- 
Brian D. Ripley,                  ripley at 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



More information about the R-devel mailing list