[R] using argument names (of indeterminate number) within a function

Gabor Grothendieck ggrothendieck at gmail.com
Tue Jul 19 20:07:11 CEST 2005

On 7/19/05, Dirk Enzmann <dirk.enzmann at jura.uni-hamburg.de> wrote:
> Although I tried to find an answer in the manuals and archives, I cannot
> solve this (please excuse that my English and/or R programming skills
> are not good enough to state my problem more clearly):
> I want to write a function with an indeterminate (not pre-defined)
> number of arguments and think that I should use the "..." construct and
> the match.call() function. The goal is to write a function that (among
> other things) uses cbind() to combine a not pre-defined number of
> vectors specified in the function call. For example, if my vectors are
> x1, x2, x3, ... xn, within the function I want to use cbind(x1, x2) or
> cbind(x1, x3, x5) or ... depending on the vector names I use in the
> funcion call. Additionally, the function has other arguments.
> In the archives I found the following thread (followed by Marc Schwartz)
> http://finzi.psych.upenn.edu/R/Rhelp02a/archive/15186.html
> [R] returning argument names from Peter Dalgaard BSA on 2003-04-10 (stdin)
> that seems to contain the solution to my problem, but I am stuck because
>  sapply(match.call()[-1], deparse) gives me a vector of strings and I
> don't know how to use the names in this vector in the cbind() function.
> Up to now my (clearly deficit) function looks like:
> test <- function(..., mvalid=1)
> {
>   args = sapply(match.call()[-1], deparse)
> # and here, I don't know how the vector names in args
> # can be used in the cbind() function to follow:
> #
> # temp <- cbind( ???
>   if (mvalid > 1)
>   {
> #  here it goes on
>   }
> }
> Ultimately, I want that the function can be called like
> test(x1,x2,mvalid=1)
> or
> test(x1,x3,x5,mavlid=2)
> and that within the function
> cbind(x1,x2)
> or cbind(x1,x3,x5)
> will be used.

If you just need to pass them to cbind then just use cbind(...), e.g.

  test <- function(..., m) if (m > 1) cbind(...) else m

otherwise, use list(...) as shown by a previous answer or here

  test2 <- function(..., m) if (m > 1) length(list(...)) else m

More information about the R-help mailing list