# [R] take precisely one named argument

Gabor Grothendieck ggrothendieck at myway.com
Fri Dec 17 16:31:52 CET 2004

```Robin Hankin <r.hankin <at> soc.soton.ac.uk> writes:

:
: Hi
:
: I want a function that takes precisely one named argument and no
: unnamed arguments. The named argument must be one of "a" or "b".
:
: If "a" is supplied, return "a".  If "b" is supplied, return 2*b.
: That is, the desired behaviour is:
:
: R> f(a=4)   #return 4
: R> f(b=33)  #return 66
: R> f(5)      #error
: R> f(a=3,b=5)   #error
: R> f(a=3,q=3)   #error
: R> f(q=3)       #error
:
: The following function is intended to implement this:
:
: f <- function(a=NULL, b=NULL){
:    if(!xor(is.null(a), is.null(b))){stop("specify exactly one of a and
: b")}
:    if(is.null(a)){return(2*b)}else{return(a)}
: }
:
: It almost works, but  f(6) returns 6 (and should be an error).
:
: What is the best way to accomplish my desired behaviour?

Here is one way to do it.  nm are the names (where the [-1] removes
the function name).  The ... traps any arg that is not a or b and the
stopifnot conditions ensure that exactly one of a and b are specified.

ff <- function(..., a = 0, b = 0) {
nm <- names(match.call()[-1])
stopifnot(length(nm) == 1, nm %in% c("a", "b"))
a+2*b
}

One thing to watch out for is that if

```