Skip to content

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

2 messages · Jeffrey J. Hallman, Brian Ripley

#
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
#
The issue is the use of UseMethod(), which you claim to be valid.  As it
is inconsistent with the prime documentation, the help page, I would
question if it is `perfectly legal'.  I expect the author of isUME
implemented the behaviour described on the help page.

It is documented in S-PLUS as *strongly discouraged*, and although it is
documented in R-lang, I believe the right thing to do is to make the code
agree with the prime documentation.

I see no uses of UseMethod() in the R sources, and on CRAN only
one in a comment (and none in BioC).
On Thu, 28 Oct 2004 jhallman@frb.gov wrote: