[R] improving match.args()

oehl_list@gmx.de oehl_list at gmx.de
Thu May 2 14:33:15 CEST 2002


Here is a suggestion for improving match.arg()
Comments welcome.

Best


Jens Oehlschlägel


# up to now match.arg() works as

t1 <- function( param = c("default", "alternative1", "alternative2") ){
  param <- match.arg(param)
  param
}

# and 

args(t1)

# > function (param = c("default", "alternative1", "alternative2")) 
# misleadingly tells us the default of param would be a vector of length 3
 
# the modified version of match.args() works as before, but additionally
allows us to be more clear about our parameter default:

t1 <- function( param = c("default", "alternative1", "alternative2")[1] ){
  param <- match.arg1(param)
  param
}
 
# so 

args(t1)

# > function (param = c("default", "alternative1", "alternative2")[1]) 
# gives the desired clarity

# of course, if we have only one default extracted by [1] the following 
t1 <- function( param = letters[1] ){
  param <- match.arg1(param)
  param
}
# will allow too many values, however, with only one default, isn't using
match.arg() nonsense anyhow?


match.arg1 <- function (arg, choices)
{
    if (missing(choices)) {
        formal.arg <-
formals(sys.function(sys.parent()))[[deparse(substitute(arg))]]
        if (length(formal.arg)==3 && formal.arg[[1]]=="[" &&
formal.arg[[3]]==1)
          formal.arg <- formal.arg[[2]]
        choices <- eval(formal.arg)
    }
    if (all(arg == choices)) 
        return(choices[1])
    i <- pmatch(arg, choices)
    if (is.na(i)) 
        stop(paste("ARG should be one of", paste(choices, collapse = ", "), 
            sep = " "))
    if (length(i) > 1) 
        stop("there is more than one match in match.arg")
    choices[i]
}



-- 
GMX - Die Kommunikationsplattform im Internet.


-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list